mysql - 我怎样才能更好地优化这个查询?

标签 mysql sql query-optimization

这是一个耗时超过 20 分钟的查询。

SELECT * FROM company WHERE Age>5 GROUP BY Network ORDER BY Network DESC LIMIT 0,2001

我有关于年龄和网络的索引。有没有办法更有效地运行这个查询?可以选择使用服务器端语言 (php) 运行多个单独的查询。

最佳答案

根据age、network、companyid创建复合索引并测试其运行时间:

SELECT network, min(companyid)
FROM company
WHERE Age > 5
GROUP BY network;

这应该使用索引并且相当快。

现在,加入以获取其余信息:

select c.*
from company c join
     (SELECT network, min(companyid) as mincompanyid
      FROM company
      WHERE Age > 5
      GROUP BY network
      ORDER BY network DESC
      LIMIT 0, 2001
     ) n
     ON c.companyid = n.mincompanyid;

假设company有一个名为companyid的主键和一个关于age、network、companyid的复合索引。

编辑:

如果第一个查询相当快,则估计获取 2001 个不重复名称所需的行数。然后执行:

select c.*
from company c join
     (SELECT network, min(companyid) as mincompanyid
      FROM (SELECT c.*
            FROM company
            WHERE Age > 5
            ORDER BY network DESC
            LIMIT 10000
           ) c
      GROUP BY network
      ORDER BY network DESC
      LIMIT 0, 2001
     ) n
     ON c.companyid = n.mincompanyid;

在本例中,假设 10,000 个网络足以容纳 2,001 个网络。此版本应该修复性能问题。

关于mysql - 我怎样才能更好地优化这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28287565/

相关文章:

mysql - SQL - 查询优化以处理大数据

mysql - SQL : Show search parameter in result, 即使结果为空

php - MySQL 查询在一个查询中检查多条记录

java - Liferay 两个表上的动态子查询

mysql - 无法处理数据库中存储的日期、日期格式、选择不同和排序方式

database - 外键会影响性能/存储效率吗?

mysql - MySQL 存储过程中的语法错误

php - 如何在 MYSQL 中回显存储为数组的值?

mysql - 如何在 dolphindb 中创建 View ?

MySQL优化查询