2015-11-03 49 views
0

我有一个相当大的数据库(800 + MB转储文件),我导入到我的本地服务器。它是一个来自女巫的Wordpress数据库,我需要提取特定的帖子。里面有大约16万个帖子。MySQL的很长的查询

目前即时通讯测试位与MySQL工作台运行与JOIN简单的查询,它需要大量的时间,这么长时间实际上是工作台停止处理。

Here`s一个例子:

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的DB模式: 当然enter image description here

机会是我只是不善于SQL,不是我的场......

回答

0

如果您有加入你使用的列的所有索引(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 Clustered索引。

+0

有我所知,没有其他问题。我不认为该表是索引。我把它作为转储并导入它运行大型txt文件(一堆查询)。如果我将它在MySQL工作台中编入索引,然后用Eclipse(JAVA)连接到它,那么表仍然会被索引? – klo

+0

我更新了我的答案。 – Amel

+0

问题是,在数据库导入过程中,最后几个查询没有执行,其中大多数都是索引。 – klo

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记录附加到这些记录的信息。 你也为你放弃NULL元组与WHERE条件不需要LEFT JOIN

至于速度,我建议运行带有EXPLAIN前置查询和检查一切正常索引和正在使用这些指标。

+0

这只是一个测试querry。我真的需要从表格中提取数据,因此需要连接。 – klo