这是我的查询的“解释”:
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
没有日期(开始日期、结束日期)过滤器:
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
可能的键是:
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 个字段进行过滤,并且没有明确的字段顺序(随机顺序的随机字段) 。那么这种类型的搜索又会太慢了。那么最好的策略是什么?一个包含“所有”可能的可搜索字段的覆盖索引?如果是,索引中字段的顺序重要吗? (即,如果该顺序与查询中字段的顺序不同,是否会使用索引?
最佳答案
首先,在没有看到您的创建表语句的情况下,我可以提供以下内容...创建最适合适用于 where 子句的常见查询元素的复合索引(多个字段),从较小的名义计数基础开始。由于您明确查找“cl_ID”和“si_ID”以及开始日期和结束日期。由于您有一个分组依据,我会将其添加到索引中以达到优化目的,并且成为一个完全覆盖的索引,因此引擎不需要返回原始数据来完成查询。可以直接通过索引中的所有字段进行解析。
我会有一个索引
( cl_id, si_id, start_date, end_date, sell_fmt )
最后,将计数从 count(sell_fmt) 更改为 count(*),表示“我不关心特定字段,只要找到一条记录,就对其进行计数”
关于mysql - 查询太慢,且没有使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142516/