MySQL很长的查询

时间:2015-11-03 09:46:32

标签: mysql wordpress join timeout mysql-workbench

我有一个非常大的数据库(800 + Mb转储文件),我导入到我的本地服务器。它来自巫婆的Wordpress数据库我需要提取某些帖子。里面有大约160000个帖子。

目前我正在测试MySql Workbench使用JOIN运行简单查询,这需要很多时间,实际上Workbench停止处理的时间很长。

这是一个例子:

SELECT 
    COUNT(*)
FROM wp_posts
LEFT JOIN wp_term_relationships 
  ON wp_posts.ID = wp_term_relationships.object_id
LEFT JOIN wp_term_taxonomy 
  ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
LEFT JOIN wp_terms 
  ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_terms.term_id = 195;

跑步超过600秒。 这是一个wordpress数据库架构: enter image description here

当然,我在SQL上的表现很糟糕,而不是我的领域......

2 个答案:

答案 0 :(得分:0)

如果你有用于加入的列的所有索引(wp_posts.ID,wp_term_relationships.object_id等),这应该不是问题,查询应该在不到1秒内执行(1秒很多,太)。

此外,可能还有等待队列(锁)中的其他查询,因此您应该将其添加到这些查询中:

Q

在工作台中创建索引。我在这里可以看到你正在加入每个表上的ID,因为它们是ID列,它们应该是PRIMARY KEY,并在它们上创建UNIQUE Clustered索引。

答案 1 :(得分:0)

如果您真的只是在运行计数,您可以通过以下方式获得结果:

 SELECT COUNT(*)
   FROM wp_term_relationships wtr
   JOIN wp_term_taxonomy wtt
     ON wtt.term_taxonomy_id = wtr.term_taxonomy_id
  WHERE wtt.term_id = 195;

您不需要附加到这些记录的强制性wp_termswp_posts记录中的信息。 当您放弃LEFT JOIN条件NULL元组时,您也不需要WHERE

至于速度,我建议运行EXPLAIN前面的查询并检查所有内容是否正确索引并且正在使用这些索引。