MySQL 查询性能 (InnoDB)
MySQL Query Performance (InnoDB)
我有一个 InnoDB
table 约 50MB(约 500.000 个条目)。
Table结构:iduser_id信息
查询:
我想获取ID大于10的该用户的下一个条目:
SELECT * FROM `table` WHERE `user_id`=1 AND `id` > 10 LIMIT 1
(响应:~0.5 毫秒)
我想获取ID大于300000的用户的下一个条目:
SELECT * FROM `table` WHERE `user_id`=1 AND `id` > 300000 LIMIT 1
(响应:~215ms)
我尝试了几个索引,但没有一个减少响应时间:
ALTER TABLE table ADD INDEX (user_id, id);
在这种情况下如何提高性能?
假设 id
是你的 PRIMARY KEY
,你应该创建这个索引:
ALTER TABLE table ADD INDEX (user_id);
并为您的查询添加 ORDER BY
条件:
SELECT *
FROM `table`
WHERE `user_id` = 1
AND `id` > 300000
ORDER BY
id
LIMIT 1
索引实际上在 (user_id, id)
上,因为索引键中缺少的主键列隐式地是每个 InnoDB 二级索引的尾随部分。
我有一个 InnoDB
table 约 50MB(约 500.000 个条目)。
Table结构:iduser_id信息
查询:
我想获取ID大于10的该用户的下一个条目:
SELECT * FROM `table` WHERE `user_id`=1 AND `id` > 10 LIMIT 1
(响应:~0.5 毫秒)
我想获取ID大于300000的用户的下一个条目:
SELECT * FROM `table` WHERE `user_id`=1 AND `id` > 300000 LIMIT 1
(响应:~215ms)
我尝试了几个索引,但没有一个减少响应时间:
ALTER TABLE table ADD INDEX (user_id, id);
在这种情况下如何提高性能?
假设 id
是你的 PRIMARY KEY
,你应该创建这个索引:
ALTER TABLE table ADD INDEX (user_id);
并为您的查询添加 ORDER BY
条件:
SELECT *
FROM `table`
WHERE `user_id` = 1
AND `id` > 300000
ORDER BY
id
LIMIT 1
索引实际上在 (user_id, id)
上,因为索引键中缺少的主键列隐式地是每个 InnoDB 二级索引的尾随部分。