MySQL不使用索引,而是使用where

MySQL not using index instead using where

提问人:user846445 提问时间:2/1/2021 最后编辑:Deepak Raiuser846445 更新时间:2/2/2021 访问量:444

问:

我正在将 mysql 用于我的数据库。我有 200,000 条记录,有 30 列。我正在使用 6 列(txn_date,v_name,transaction_status、sid、pnum、txn_num)创建一个复合索引。当我对以下查询进行解释时,where 子句中有这 6 列,解释使用索引直到某些txn_date,然后根据 explain 命令的输出使用其中条件

SELECT * FROM transactions  
WHERE txn_date between '2021-01-10' and  '2021-01-19'
  and v_name ='Vo' 
  AND transaction_status = 'failed' 
  AND sid = '566' 
  AND txn_num = 100 
  AND p_num = 5; 

在上面的查询中,当txn_date日期为 1 月 10 日至 1 月 18 日时,其 using index 及高于其 using where 条件。请帮助我有效地使用索引,以便它始终使用索引

MySQL SQL 数据库

评论

1赞 lmarqs 2/1/2021
有时综合指数不是解决方案。因为索引变得如此之大,以至于对原始表进行扫描比查看索引然后从表中检索记录更便宜。尝试改用 only 创建索引。txn_date
0赞 Tim Biegeleisen 2/1/2021
除上述情况外,如果给定表只有几百条/千条记录,有时MySQL不会费心使用索引。这张桌子有多大?
1赞 user846445 2/1/2021
@TimBiegeleisen :它有 295,000 行。
1赞 Akina 2/1/2021
请帮助我有效地使用索引,以便它始终使用索引这毫无意义。要使 undex 使用有效,其选择性必须超过 ~15-20。当范围很宽时,服务器决定表扫描更有效(并且可能是服务器是正确的 - 尝试强制使用索引!如果您需要有效索引而不是创建索引,该索引以任何顺序包括 WHERE 中列出的所有其他 5 列(所有列都按单个值过滤),则添加为最后一列。txn_date
2赞 Akina 2/1/2021
dbfiddle.uk/......

答:

1赞 Rick James 2/2/2021 #1

以日期结尾;从使用“=”测试的列开始。

索引的列将从左侧使用,但不会在范围测试之后使用,因此您的索引并不比仅包含日期的 1 列索引好。鉴于此,优化器可能发现需要使用大约 20% 的表(基于日期范围)并进行处理。也就是说,它决定简单地扫描表格可能会更快。

此讨论适用于任何大小的表。

FORCE INDEX会迫使它使用索引,但那又怎样?优化器非常擅长确定小日期范围可以有效地使用索引,但大范围则不能。如果添加 ,它有时可能会有所帮助,但在其他情况下会造成严重伤害。FORCE

通过将所有测试放在索引的首位,可以避免有关日期范围内有多少天的大量讨论。=

有关索引构建的更多信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql

评论

0赞 user846445 2/2/2021
将查询最长 31 天。是否可以在某些特定查询上使用force_index?
0赞 Rick James 2/3/2021
@user846445 - 实验。计时,有提示,没有提示。如果不使用索引速度更快,为什么担心它没有使用索引呢?FORCE INDEXIGNORE INDEX
0赞 user846445 2/3/2021
肯定会做到的