我的 mysql 查询看起来有点像这样
SELECT * FROM table1
WHERE table1.column_1 = 'a' AND table1.column_2 = 'b'
AND :idList IN
(SELECT id FROM table1 WHERE table1.column_3 = 'c' AND table1.column_4 = 'd')
:idList is a parameter passed in a function where this query is written
我需要向
table1
添加索引以加速此操作,因为 table1
很大并且在已使用的列上没有任何索引。如果我理解正确的话,添加两个索引 (column_1, column_2)
和 (column_3, column_4)
后,只会使用其中一个。(column_1, column_2)
上添加索引。运行查询。删除索引并在 (column_3, column_4)
上添加另一个索引。运行查询。停止最快的变体(column_1, column_2, column_3, column_4)
我知道
EXPLAIN
,但到目前为止,在这个特殊情况下它并没有太大帮助
你说:
如果我理解正确的话,添加两个索引(column_1,column_2)和(column_3,column_4)后,只会使用其中一个。
事实上,
(column_1, column_2)
和 (column_3, column_4)
上的两个单独的索引应该有助于提高性能。 第一个索引可以在主查询中使用,第二个索引可以在子查询中使用。 应该注意的是,在 InnoDB 上运行的 MySQL 中,id
列将有效地添加到两个索引的末尾,这意味着第一个索引实际上将表现为 (column_1, column_2, id)
,第二个索引也是如此。
鉴于主查询和子查询是查询管道中的单独步骤,MySQL 没有理由不能在同一查询中同时使用两个索引。 所以,你现在的调整已经很好了,你应该通过运行来验证这一点:
EXPLAIN ANALYZE
SELECT *
FROM table1 t1
WHERE column_1 = 'a' AND column_2 = 'b' AND
id IN (
SELECT id
FROM table1 t2
WHERE t2.column_3 = 'c' AND t2.column_4 = 'd
);
上面的输出将向您显示是否正在使用您定义的索引。