2015-11-03 88 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