在下面的查询中,from
和tid
是replies
表的索引。
SELECT * FROM `replies`
WHERE `from`="<userId>"
OR `tid` IN (SELECT `tid` FROM `posts` WHERE `from`="<userId>")
通过使用“OR”,它似乎进行了全表扫描(约 300 万行)。EXPLAIN
说可能的键是,from
但它不使用任何键。
但是,在下面的查询中,frid_lt
和frid_gt
都被索引了。这两列在一个复杂的索引(frid_lt,frid_gt)中,但frid_gt
也有自己的索引。
SELECT `mid` FROM `messages`
WHERE `frid_lt`="<userId>" OR `frid_gt`="<userId>"
这个查询确实使用了两个索引。上面写着“ EXPLAIN
index_merge”和“Using sort_union(frid_lt,frid_gt); Using where”。
为什么第一个查询不使用索引合并?
我可以做任何改进以使引擎也使用索引合并吗?
OR
没有优化好。一个常见的解决方法是使用UNION
:请注意,我还避免了通常效率低下的
IN ( SELECT ... )
为了进一步提高性能,请使用以下索引:
(注意这
PRIMARY KEY
是一个索引,所以不要添加冗余索引。)在您的第二个示例中,您遇到的“索引合并”可能比
UNION
.哦,这是一个更新
要优化
UPDATE
,请执行两个单独的操作UPDATEs
(不UNION
,不OR
)。一个直接检查from
。另一个是类似于上面第二个选择的“多表更新”(参见手册)。