查询太慢,而不是使用索引

时间:2015-06-30 15:30:58

标签: mysql

这是我的查询的“解释”:

explain
select eil.sell_fmt, count(sell_fmt)  as itemCount 
from table_items eil  
where eil.cl_Id=123 and eil.si_Id='0' 
  and start_date <= now() and end_date is not null and end_date < NOW() 
group by eil.sell_fmt

没有日期(start_date,end_date)过滤器:

id  select_type table   type            possible_keys   key             key_len     ref     rows    Extra
1   SIMPLE      eil ref                 table_items_clid_siid_sellFmt   39      const,const 7393    Using where; Using index

使用日期过滤器:

id  select_type table   type            possible_keys   key             key_len     ref     rows    Extra
1   SIMPLE      eil ref                 table_items_clid_siid_sellFmt   39      const,const 8400    Using where

possible_keys是:

table_items_clid_siid, table_items_clid_siid_itemId, table_items_clid_siid_startDate_endDate, table_items_clid_siid_sellFmt 

没有日期过滤器的查询速度非常快(0.4秒),但使用日期过滤器时,大约需要30秒。总记录仅为14K。

表字段类型:

`cl_Id` int(11) NOT NULL,
`si_Id` varchar(11) NOT NULL,
`start_date` datetime DEFAULT NULL,
`end_date` datetime DEFAULT NULL,
`sell_fmt` varchar(20) DEFAULT NULL

我连接字段名称以提供索引名称,因此您可以估计索引中可用的组合字段。

有人可以在这里指导我吗?这里发生了什么?我应该采取什么样的行动,或者我做错了什么?

我还需要一个建议 n:在同一个表上的另一个查询中,用户可以根据UPTO 10字段进行过滤,并且没有明确的字段顺序(随机顺序的字段随机数) 。然后这种类型的搜索会再次变得太慢。那么最好的策略是什么?一个覆盖索引与“所有”可能的可搜索字段?如果是,索引中的字段顺序是否重要? (即如果该顺序与查询中的字段顺序不同,是否会使用索引?

1 个答案:

答案 0 :(得分:0)

首先,在没有看到你的create table语句的情况下,我可以提供以下内容...创建最适合适用于where子句的公共查询元素的复合索引(多个字段),从较小的名义计数开始。因为你明确地寻找&#34; cl_ID&#34;和&#34; si_ID&#34;加上开始和结束日期。由于您有一个group by,我会将其添加到索引中以进行优化,并且是一个完全COVERING索引,因此引擎无需返回原始数据即可完成查询。它可以直接通过索引中的所有字段解析。

我会在

上有一个索引
( cl_id, si_id, start_date, end_date, sell_fmt )

最后,将您的点数从计数(sell_fmt)更改为仅计数(*)表示&#34;我不关心特定字段,只要找到记录,计算它&#34 ;