MySQL 不使用索引而是使用 where

时间:2021-02-01 09:54:39

标签: mysql sql database

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

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 是从 10 Jan 到 18 Jan 的日期时,它的 using 索引和高于它的 using where 条件。请帮助我有效地使用索引,以便它始终使用索引

1 个答案:

答案 0 :(得分:1)

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

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

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

FORCE INDEX 会强制它使用索引,但那又怎样?优化器非常擅长决定小日期范围可以有效地使用索引,但大范围不能。如果您添加 FORCE,在某些情况下可能会有所帮助,但在其他情况下可能会受到严重伤害。

通过将所有 = 测试放在索引中,避免了很多关于日期范围内有多少天的讨论。

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

相关问题