当表在一个查询中使用两次时,Mysql 多列索引方法

问题描述 投票:0回答:1

我的 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)
后,只会使用其中一个。
在这里添加索引的正确方法是什么?到目前为止我尝试过的选项:

  1. (column_1, column_2)
    上添加索引。运行查询。删除索引并在
    (column_3, column_4)
    上添加另一个索引。运行查询。停止最快的变体
  2. 添加索引
    (column_1, column_2, column_3, column_4)

我知道

EXPLAIN
,但到目前为止,在这个特殊情况下它并没有太大帮助

sql mysql indexing
1个回答
0
投票

你说:

如果我理解正确的话,添加两个索引(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
    );

上面的输出将向您显示是否正在使用您定义的索引。

© www.soinside.com 2019 - 2024. All rights reserved.