Using filesort 表示 MySQL 無法利用索引完成 ORDER BY,需在內存/磁盤臨時表中排序,性能顯著下降。根因通常是 WHERE 與 ORDER BY 列不在同一索引中。
-- 原表索引 CREATE INDEX idx_user_id ON user(id); -- 查詢 SELECT * FROM user u WHERE u.id = 100 ORDER BY u.update_time;
EXPLAIN 顯示 Using filesort,因 idx_user_id 不包含 update_time。
DROP INDEX idx_user_id ON user; CREATE INDEX idx_user_id_update_time ON user(id, update_time);
EXPLAIN SELECT * FROM user u WHERE u.id = 100 ORDER BY u.update_time; +----+-------------+-------+------+--------------------------+--------------------------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+--------------------------+--------------------------+---------+-------+------+-------+ | 1 | SIMPLE | u | ref | idx_user_id_update_time | idx_user_id_update_time | 8 | const | 1 | | +----+-------------+-------+------+--------------------------+--------------------------+---------+-------+------+-------+
Extra 列空,Using filesort 消失。
SELECT * FROM user u FORCE INDEX(idx_user_id_update_time) WHERE u.id = 100 ORDER BY u.update_time;
SHOW INDEX 審計低選擇性索引。