我在某处读到这两个索引组之间有所不同:
ADD KEY id_user (id_user,seen);
ADD KEY id_user (seen,id_user);
实际上我在一张桌子上有这两个查询:
查询1:
SELECT * FROM mytable WHERE id_user = :id AND seen IS NULL
QUERY2:
SELECT * FROM mytable WHERE id_user = :id AND timestamp > :tm
那么在我的案例中哪种索引是正确的?目前,我在id_user
,seen
,timestamp
列上有三个分开的索引。
答案 0 :(得分:1)
您的查询在id_user
上都具有相等条件。因此,要么可以利用索引,其中id_user
是索引中的第一个键。所以,我会推荐你提到的第一个索引。
MySQL有很多关于多列索引的文档。我建议你开始there来了解它们。
您的查询可以利用(id_user, seen)
和(id_user, timestamp)
上的索引。也许,第一把钥匙是最重要的。您应该尝试这些不同的索引,看看哪个最符合您的性能目标。
答案 1 :(得分:1)
最有可能的是,user_id
上的索引就足够了。但是如果你有多次重复user_id
s,那么你可以制作两个索引组
ADD KEY id_user1 (id_user, seen);
ADD KEY id_user2 (id_user, timestamp);
选择将首先使用user_id
来减少数量或匹配,然后使用timestamp
或seen
中的第二个字段。
对于查找user_id
和seen
的选项,这两个索引
ADD KEY id_user1 (id_user,seen);
ADD KEY id_user2 (seen,id_user);
的结果大致相同。
在任何情况下,您都应该使用EXPLAIN SELECT * FROM ...
来检查慢查询的执行情况,这样您就可以确切地看到它的速度,以及您的索引是否按预期实际使用。