Mysql查询调优(大数据集)和解释计划

时间:2014-04-15 13:51:14

标签: mysql optimization normalization explain

我使用的是mysql5.1,我的表有大约15万(150万)个记录。这个表有不同实体的记录,即所有主实体的子记录。

此表格中有8列,其中6列用于制作主键。 这些列可能是单独的外键,但由于性能的原因,我们对此进行了更改。

即使是一个有两个条件的简单选择语句也需要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. 此表的索引正常

1 个答案:

答案 0 :(得分:1)

有两件事可以帮助你。

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

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

(status_id, trial_data, location_code, trial_number)

为什么这是正确的指数?因为MySQL索引被组织为BTREE。该组织允许服务器随机访问索引以查找特定值。在您的情况下,您需要status_idtrial_data的特定值。一旦服务器随机访问了索引,它就可以顺序扫描。在这种情况下,您希望扫描location_code的各种值。服务器知道它将按顺序找到那些不同的值。最后,服务器需要选择trial_number的值以在MAX()函数中使用。瞧,他们在指数准备采摘。

(如果您正在对大型表进行大量聚合和查询,那么了解复合和覆盖索引的工作方式是有意义的。)

添加索引需要付出代价:当您INSERTUPDATE行时,您还必须更新索引。但是这种索引会大大加快你的检索速度。