2011-04-10 44 views
1

我對MySQL並不瞭解,正如任何非DBA程序員都知道的:如何獲取數據。選擇連接X到Y比將Y連接到X快十倍 - 爲什麼這樣?

我在我的網站上有一個頁面運行得非常慢,查詢是瓶頸。這需要十秒鐘來做到這一點:

SELECT foo, bar, baz, bax 
    FROM small_table 
    LEFT JOIN 
    large_table 
    on small_table.id = large_table.thread_id 

我沒有任何索引,所以我索引id列。現在需要六秒鐘。

然後我做了一些閱讀,嘗試ANALYZEEXPLAIN命令,但並沒有真正瞭解他們,然後只是爲了實驗,改變了周圍的表:

SELECT foo, bar, baz, bax 
    FROM large_table <-- first 
    LEFT JOIN 
    small_table <-- second 
    on small_table.id = large_table.thread_id 

,現在花了零點六秒。

[該應用程序是一個論壇。 small_ table列出了螺紋(100條記錄),並large_ table包含這些線程(20,000條記錄)的帖子]

我可以,當然,繼續實驗,但有些問題:

  • 什麼我有沒有發現原理?
  • 一般來說,當我的選擇緩慢時,最好的處理方式是什麼?
  • 在上面的例子中,我是否和以前一樣有SELECT?它產生完全相同的結果。
  • 我應該從ANALYZEEXPLAIN學到什麼?

回答

3

我敢打賭,由此產生的數據是不同的......除非你保留在select中的列都在小表中。

left join保留第一個表的每一行,並在存在匹配時添加第二個表中的行。

在你的第一種情況下,第一個表是大的,所以你有很多行。

在第二種情況下,第一個表是小的,因此您的行數減少了,因此查詢速度更快。

+0

請問您能明確什麼是「第一」表?第一個按文件順序?因爲我說查詢以big_table JOIN small_table運行得更快,您似乎認爲它應該是相反的方式。 [順便說一下,我認爲這些數據與我忽略查詢的其他部分的原因是一樣的。] – AmbroseChapel 2011-04-11 00:51:54

相關問題