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

时间:2008-11-04 12:26:18

标签: sql mysql indexing

我对我的数据库进行了查询:

SELECT * FROM expenses WHERE user_id = ? AND dated_on = ?

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

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

SELECT * FROM expenses WHERE user_id = ?

创建另一个仅对user_id列编制索引的索引是否有任何好处,或者上述user_id / dated_on索引是否同样有效使用?

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

SELECT * FROM expenses WHERE dated_on = ?

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

2 个答案:

答案 0 :(得分:8)

MySQL可以使用any left portion of an index

在您的示例中,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上的索引

答案 1 :(得分:5)

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