提问人:user846445 提问时间:2/1/2021 最后编辑:Deepak Raiuser846445 更新时间:2/2/2021 访问量:444
MySQL不使用索引,而是使用where
MySQL not using index instead using where
问:
我正在将 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 条件。请帮助我有效地使用索引,以便它始终使用索引
答:
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 INDEX
IGNORE INDEX
0赞
user846445
2/3/2021
肯定会做到的
评论
txn_date
txn_date