繁体   English   中英

MySQL查询调整(大数据集)并说明计划

[英]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

我有以下问题:

  1. 如何处理大数据表
  2. 该表的索引很好吗

有两件事可能会对您有所帮助。

首先, SELECT DISTINCT在聚合查询中毫无意义。 只需使用SELECT

其次,您没有透露创建的索引。 但是,为了有效地满足此查询,以下复合覆盖索引可能会很有帮助。

(status_id, trial_data, location_code, trial_number)

为什么这是正确的索引? 因为MySQL索引组织为BTREE。 该组织允许服务器随机访问索引以查找特定值。 在您的情况下,您需要status_idtrial_data特定值。 服务器随机访问索引后,便可以顺序扫描。 在这种情况下,您希望扫描location_code各种值。 服务器知道它将按顺序找到那些不同的值。 最后,服务器需要提取出trial_number值以在您的MAX()函数中使用。 瞧,索引中已经准备好要进行摘录了。

(如果您要对大型表进行大量汇总和查询,那么了解复合索引和覆盖索引的工作方式就很有意义。)

添加索引是有代价的:当您INSERTUPDATE行时,还必须更新索引。 但是这种索引将极大地加快您的检索速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM