优化技术从两个大型表中获取数据而不使用MySql中的连接

时间:2017-02-22 07:39:04

标签: mysql fetch

我正在研究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;

请给我建议,以便在最短的时间内获得所需的行。

谢谢

1 个答案:

答案 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