我正在研究MySQL并在服务器加载时间面临问题。这是我的桌子的结构和查询:
我需要从message
(超过560万行)表中获取50行。message
表具有(ID,Description,fure_id,timeline_id)和条件,每个author_id
都存在于users
(超过38K行)中。
表创建脚本是:
CREATE TABLE IF NOT EXISTS `messages` (
`id` int(11) NOT NULL,
`post_description` text() NOT NULL
`author_id` int(11) NOT NULL,
`timeline_id` int(11) NOT NULL,
);
ALTER TABLE `messages`
ADD PRIMARY KEY (`id`);
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL,
`username` text() NOT NULL
);
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);
为此,我正在使用以下SQL查询:
SELECT
m.id
, m.post_description
, m.author_id
, m.timeline_id
, u.username
FROM message m, users u
WHERE m.timeline_id ='1868'
AND m.id <= '28190'
AND m.author_id NOT IN (24974,7920,1498,9020,0)
AND u.id=m.author_id
ORDER BY m.id
DESC LIMIT 0 ,51;
请给我建议,以在最快的时间内获取所需的行。
谢谢
这是一个简单的情况。您需要在(https://dev.mysql.com/doc/refman/5.7/en/create-index.html)上使用索引:
messages.author_id
您不需要用户上的索引,因为默认情况下为MySQL索引。
考虑使用查询计划,这可以帮助您确定绩效问题:https://dev.mysql.com/doc/workbench/en/wb-performance-explain.html
使用上述所有设置,您的查询应该看起来像*:
SELECT
m.id
, m.post_description
, m.author_id
, m.timeline_id
, u.username
FROM message m
join users u
on m.author_id = u.id
WHERE m.author_id NOT IN (24974,7920,1498,9020,0)
AND m.timeline_id ='1868'
AND m.id <= '28190'
ORDER BY m.id
DESC LIMIT 0 ,51;
*您的原始查询也会随上述索引更改而更快,但是我认为使用隐式加入使查询更可读。
编辑:
根据@panagiotis kanavos,感谢Panagiotis,您可能必须在查询计划中看到其他导致慢速的情况。您可能还需要在m.timeline_id上进行索引。
当然,您需要在创建索引后分析表(https://dev.mysql.com/doc/refman/5.7/en/analyze-table.html)
edit2:
您也可以考虑使用外键,但这不是性能工具,它是一个完整性概念:https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-foreign-keys.html
您可以参考有关FK和性能的答案:MySQL的外国钥匙是否会降低性能