我的数据库使用 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 条件。请帮助我有效地使用索引,以便它始终使用索引
答案 0 :(得分:1)
以日期结束;从使用“=”测试的列开始。
索引的列将从左侧使用,但不会在范围测试之后使用,因此您的索引并不比仅包含日期的 1 列索引好。鉴于此,优化器可能会发现需要使用超过大约 20% 的表(基于日期范围),并弃用。也就是说,它决定简单地扫描表可能会更快。
此讨论适用于任何大小的表格。
FORCE INDEX
会强制它使用索引,但那又怎样?优化器非常擅长决定小日期范围可以有效地使用索引,但大范围不能。如果您添加 FORCE
,在某些情况下可能会有所帮助,但在其他情况下可能会受到严重伤害。
通过将所有 =
测试先放在索引中,避免了很多关于日期范围内有多少天的讨论。
关于建立索引的更多信息:http://mysql.rjweb.org/doc.php/index_cookbook_mysql