在查询中仅使用一列时,多列MySQL索引的性能

Oll*_*lly 6 mysql sql indexing

我对我的数据库有一个查询:

SELECT * FROM expenses WHERE user_id = ? AND dated_on = ?
Run Code Online (Sandbox Code Playgroud)

我在user_iddated_on列上添加了一个索引.当我使用检查索引时SHOW INDEXES FROM expenses,有两行 - 一行的seq_in_index值为1,另一行的seq_in_index值为2.

我的问题是,如果我然后提交一个只使用两个WHERE子句中的一个的查询,例如:

SELECT * FROM expenses WHERE user_id = ?
Run Code Online (Sandbox Code Playgroud)

创建另一个仅对user_id列进行索引的索引有什么好处,或者上面描述的user_id/ dated_onindex是否同样有效使用?

最后,如果使用查询怎么样:

SELECT * FROM expenses WHERE dated_on = ?
Run Code Online (Sandbox Code Playgroud)

seq_in_index在这种情况下,2 的值如何影响索引的使用和性能?

Gre*_*reg 8

MySQL可以使用索引的任何左侧部分.

在您的示例SELECT * FROM expenses WHERE user_id = ?中将使用索引但SELECT * FROM expenses WHERE dated_on = ?不会.

对于3列索引A,B,C,WHERE A = ? AND B = ?将使用A和B上的索引,但WHERE A = ? AND C = ?仅使用A上的索引


Ned*_*der 5

如果user_id和dated_on上的索引确实按此顺序(user_id优先),那么它也将用于user_id查询.您可以使用EXPLAIN进行检查以查看查询的实际策略.