MySQL查询极慢任何建议?

时间:2014-06-13 01:22:11

标签: mysql sql performance

我有这个MySQL查询似乎非常慢。运行需要3秒钟。这是试图从他们关注的人或他们拥有的任何兴趣中获取所有帖子。它还试图确保它不会显示任何匹配任何post_id的重复共享。你们觉得我应该做些什么?

SELECT p.*,
       IFNULL(post_data_share, UUID()) AS unq_share,
       UNIX_TIMESTAMP(p.post_time) AS a
FROM posts p
LEFT JOIN users_interests i ON (i.user_id=1
                                AND p.post_interest = i.interest)
LEFT JOIN following f ON (f.user_id=1
                          AND p.post_user_id = f.follower_id)
WHERE (post_user_id=1
       OR f.follower_id IS NOT NULL
       OR i.interest IS NOT NULL)
  AND (POST_DATA_SHARE NOT IN
         (SELECT POST_ID
          FROM posts p
          LEFT JOIN following f ON f.user_id=1
          AND p.post_user_id = f.follower_id
          LEFT JOIN users_interests i ON (i.user_id=1
                                          AND p.post_interest = i.interest)
          WHERE (post_user_id=1
                 OR f.follower_id IS NOT NULL
                 OR i.interest IS NOT NULL))
       OR POST_DATA_SHARE IS NULL)
GROUP BY unq_share
ORDER BY `post_id` DESC LIMIT 10;

2 个答案:

答案 0 :(得分:2)

以下是性能提示肯定会有所不同。

  • 尝试解释声明。
  • 通过添加主键和外键来规范化表格来改变表格
  • 为重复值添加索引。
  • 避免从表中选择*。提及指定列名称。
  • 将IS NULL转换为(='')
  • 将IS NOT NULL转换为(!='')
  • 避免更多OR条件。
  • 要探索的MySQL配置
    • 的key_buffer_size
    • innodb_buffer_pool_size
    • query_cache_size变量
    • thread_cache

更多参考此答案Best my.cnf configuration for a 8GB MySQL server with MyISAM use only

答案 1 :(得分:1)

我首先看一下查询的执行计划。以下是EXPLAIN关键字上MySQL文档的链接,向您展示优化程序如何构建查询:http://dev.mysql.com/doc/refman/5.5/en/using-explain.html

如果CPU使用率很低,可能是瓶颈是大型表扫描的磁盘访问。

执行查询的方式通常与编写方式不同。一旦了解了执行计划的结构,您可能会在最大的连接上创建索引。每个表都应该有一个聚簇索引(通常是默认创建的),但其他字段通常可以从非聚簇索引中受益。

如果问题非常严重并且这对您的应用程序至关重要,您可能需要考虑重新组织数据库。