[英]Mysql query tuning (large data set) and explain plan
我正在使用mysql5.1,我有一个表,该表有大约150万(150万)条记录。该表具有不同实体的记录,即所有主实体的子记录。
该表中有8列,其中6列被组合成一个主键。 这些列可以是单独的外键,但是由于性能,我们进行了更改。
即使是一个简单的带有两个条件的select语句也要花费6到8秒。以下是相同条件的解释计划。
询问
explain extended
select distinct location_code, Max(trial_number) as replication
from status_trait t
where t.status_id='N02'
and t.trial_data='orange'
group by location_code
EXPLAIN EXTENDED的结果
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t index FK_HYBRID_EXP_TRAIT_DTL_2 5 1481572 100.00 Using where; Using index
我有以下问题:
有两件事可能会对您有所帮助。
首先, SELECT DISTINCT
在聚合查询中毫无意义。 只需使用SELECT
。
其次,您没有透露创建的索引。 但是,为了有效地满足此查询,以下复合覆盖索引可能会很有帮助。
(status_id, trial_data, location_code, trial_number)
为什么这是正确的索引? 因为MySQL索引组织为BTREE。 该组织允许服务器随机访问索引以查找特定值。 在您的情况下,您需要status_id
和trial_data
特定值。 服务器随机访问索引后,便可以顺序扫描。 在这种情况下,您希望扫描location_code
各种值。 服务器知道它将按顺序找到那些不同的值。 最后,服务器需要提取出trial_number
值以在您的MAX()
函数中使用。 瞧,索引中已经准备好要进行摘录了。
(如果您要对大型表进行大量汇总和查询,那么了解复合索引和覆盖索引的工作方式就很有意义。)
添加索引是有代价的:当您INSERT
或UPDATE
行时,还必须更新索引。 但是这种索引将极大地加快您的检索速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.