【问题标题】:MySQL very long queriesMySQL 很长的查询
【发布时间】:2016-02-03 09:56:41
【问题描述】:

我有一个相当大的数据库(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 数据库模式:

当然机会是我只是不擅长 SQL,而不是真正的我的领域......

【问题讨论】:

    标签: mysql wordpress join timeout mysql-workbench


    【解决方案1】:

    如果您在用于连接的列上有所有索引(wp_posts.ID、wp_term_relationships.object_id 等),这应该不是问题,并且查询应该在 1 秒内执行(1 秒很多,也)。

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

    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
    
    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;
    
    COMMIT ;
    

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

    【讨论】:

    • 据我所知没有其他查询。我不认为该表已编入索引。我把它作为转储导入并运行大型 txt 文件(一堆查询)。如果我在 MySQL 工作台中索引它,然后用 Eclipse (JAVA) 连接到它,表还会被索引吗?
    • 问题是在数据库导入过程中,最后几个查询没有执行,大部分是索引。
    【解决方案2】:

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

     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,因为您将使用WHERE 条件丢弃NULL 元组。

    至于速度,我建议运行以EXPLAIN 开头的查询,并检查所有内容是否已正确编入索引以及是否正在使用这些索引。

    【讨论】:

    • 这只是一个测试查询。我真的需要从表中提取数据,所以需要连接。
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多