优化mysql慢速查询
以下查询从20lacs记录运行超过2.5秒 SELECT lid,nid ,sum(nview) as view_cnt FROM nv WHERE lid = 1 GROUP BY nid ORDER BY view_cnt desc LIMIT 20; 选择lid、nid、sum(nview)作为视图 来自内华达州 其中lid=1 nid分组 按视图排序\u cnt desc 上限20; 我将可能的键更新为索引,请帮助我优化此查询 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE nv ref lid lid 4 const 406282 "Using where; Using temporary; Using filesort" id选择\u类型表类型可能的\u键\u长度参考行额外 1简单nv ref lid 4 const 406282“使用where;使用temporary;使用filesort”优化mysql慢速查询,mysql,optimization,Mysql,Optimization,以下查询从20lacs记录运行超过2.5秒 SELECT lid,nid ,sum(nview) as view_cnt FROM nv WHERE lid = 1 GROUP BY nid ORDER BY view_cnt desc LIMIT 20; 选择lid、nid、sum(nview)作为视图 来自内华达州 其中lid=1 nid分组 按视图排序\u cnt desc 上限20; 我将可能的键更新为索引,请帮助我优化此查询 id select_type table t
您只为lid列编制了索引,是否可以将索引添加到nid列并验证查询执行时间您可以尝试在查询中使用的所有列上添加索引:
ALTER TABLE nv ADD INDEX lnv(lid,nid,nview)
因此,mysql使用索引中的列值,而不是仅在行查找中使用索引。您应该在“解释额外”列中看到使用索引的附加。它可能会稍微加快查询速度,但不要期望太多,在这种情况下,如果不更改表模式,filesort是不可避免的
如果您决定使用此索引,您可以安全地删除单个lid
列上的索引,因为复合索引也可以用于lid查找。运行SHOW CREATE TABLE view_cnt
和EXPLAIN SELECT..(您的查询)
并将结果包括在您的问题中。ORDER BY
子句也似乎可疑,您可能想改为按视图排序?我给出了SELECT查询更新的解释above@romain:同样,我对按条款订购有问题,nid
一个lid
平均有多少种不同的nid?orderby
子句需要执行filesort
操作,如果要排序的行太多,这会非常慢。我已更新了nid的索引,然后我再次给出解释,相同的结果仅显示,nid不显示在可能的键列中