gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:16:54 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com