我正在研究MySQL并面临服务器加载时的问题。这是我的表格结构和查询:
我需要从message
(超过560万行)表中获取50行。 message
表具有(id,description,author_id,timeline_id)等属性,条件是author_id
(超过38K行)表中存在users
。
表创建脚本是:
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;
请给我建议,以便在最短的时间内获得所需的行。
谢谢
答案 0 :(得分:0)
这是一个简单的案例。您需要在(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-keys.html
您可以参考有关FK和性能的答案: Does introducing foreign keys to MySQL reduce performance