我有以下查询,使用 MariaDB 10 / InnoDB:
SELECT id, sender_id, receiver_id, thread_id, date_created, content
FROM user_message
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)
此查询根据给定的条件获取消息并按创建日期排序。
我有一个覆盖索引(thread_id, date_created)
。
运行 EXPLAIN 时,使用了正确的索引并且我得到了输出“Using where”,尽管查询使用的是不在索引中的语句中间的列。我可以为“placeholder = x”使用任何值,结果是一样的。
如果我将排序更改为使用另一列,则 EXPLAIN 会正确指示“使用位置。使用文件排序”。
我有一个令人头疼的时刻。有人可以解释一下吗?我希望看到的是需要额外的文件排序,因为由于额外的列而无法完全使用覆盖索引。
使用 MySQL (InnoDB),我知道索引会减慢 UPDATE 查询的速度。我想知道无论更新哪些字段,是否都会发生这种情况。
例如,如果我有一个包含 20 个字段的表,其中前 10 个在单个索引或覆盖索引中被引用,那么其他 10 个非索引字段的更新速度是否会受到影响?