2012-08-08 118 views
0

我有以下3個表:MySQL的優化:LEFT JOIN

出版物(主鍵= 文章

article | title | pubType 

作者(主鍵= * AUTHOR_NAME *)

author_name | author_somethingelse 

pub_author_map

article | author_name 

給定值pubType,我需要選擇有關的文章,包括作者的信息。要做到這一點,我有

SELECT p.article, p.title, p.dateTime, pam.author_name FROM publications p 
LEFT JOIN pub_author_map pam ON pam.article = p.article 
LEFT JOIN authors a ON a.author_name = pam.author_name 
WHERE p.pubType = '$pubType' ORDER BY p.article LIMIT 10 

即使有LIMIT 10,這個查詢在約29秒入。 publications中有1500行,pub_author_map中有3000行。

如何優化上述查詢?

+0

請注意,LIMIT不會限制sql數據集,而是限制輸出。因此,它不應該用於生產。 – 2012-08-08 16:52:26

+0

@SebastianHojas你是說LIMIT不應該用於生產? ? – 2012-08-08 16:54:50

+0

關於你的注意事項:首先想出一個提供正確結果的查詢,然後重寫它比其他方式快速工作要好得多。沒有理由讓作者脫離示例。我們大多數人可以處理三種方式的聯接。 – 2012-08-08 16:55:39

回答

1

在列pubType

添加在列文章indicies

  • pub_author_map

  • 出版物例如這個樣子。

    CREATE INDEX pub_author_idx_1 
        ON pub_author_map (article); 
    
    CREATE INDEX publications_idx_1 
        ON publications (pubType); 
    
+0

我看指數需要一些時間來創建... – Don 2012-08-08 17:38:48

+0

這可能是,但以後你節省時間。 – hol 2012-08-08 17:46:44

+0

是的,大大改善,謝謝! – Don 2012-08-08 20:37:48

1

您可以使用索引優化表。在檢索數據時用作外鍵的索引列:這裏是編制索引的好教程,http://www.tizag.com/mysqlTutorial/mysql-index.php索引將佔用更多的磁盤空間,但是當您對數據庫中的數據相對較多的數據進行查詢時,它們可以節省數小時。

1

如果INNER JOIN提供正確的結果,請使用它。只有在您需要它提供的結果時才使用LEFT JOIN。

你是否曾經想看到沒有作者的文章?

+0

不,我不想看到那些;我實際上遵循了OMG Ponies的方法http://stackoverflow.com/questions/3151919/mysql-update-with-2-inner-joins-hangs – Don 2012-08-08 17:02:19