我对我的数据库进行了查询:
SELECT * FROM expenses WHERE user_id = ? AND dated_on = ?
我在user_id
和dated_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如何影响索引使用和性能?
答案 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进行检查,以查看查询的实际策略。