mysql - 查询太慢,且没有使用索引

标签 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

没有日期(开始日期、结束日期)过滤器:

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/

相关文章:

php - 从 MySQL 返回一个 boolean 值以在函数中用作参数

mysql - 选择文章并仅在文章喜欢时选择文章喜欢时间(如果文章喜欢中有带 userID 的行)

java - Android/PHP/MySQL 项目协助 - 保持服务器和手机应用程序同步

php - 为什么这个安装文件不起作用?

php - 更改 PHP 代码以允许传递唯一 ID

mysql - codeigniter - 如果 ip 超过 x 次尝试,则阻止 ip

具有多个可选参数的 MySQL 存储过程

mysql - 为什么groovy中的mysql查询返回空

C++ MySQL - 无法获取列名

MySQL PDO 在 3 秒或更短时间内创建并填充 1000 个小表?