2010-03-23 26 views
0

這個已經填充的數據庫來自另一個開發者。如果涉及的表中有一個沒有定義索引,mysql查詢會運行得更慢嗎?

我不確定當他創建表時發生了什麼,但是在我們的腳本中有一個涉及4個表的查詢,它運行速度超慢。

SELECT 
     a.col_1, a.col_2, a.col_3, a.col_4, a.col_5, a.col_6, a.col_7 
    FROM 
     a, b, c, d 
    WHERE 
     a.id = b.id 
    AND b.c_id = c.id 
    AND c.id = d.c_id 
    AND a.col_8 = '$col_8' 
    AND d.g_id = '$g_id' 
    AND c.private = '1' 

注:$ col_8和$ G_ID是從一種形式

這只是我的理論的變量,它是由於表b和c沒有索引,雖然我猜的開發沒」 t認爲這是必要的,因爲這些表只告訴a和d之間的關係,其中b表示a中的數據屬於某個用戶,c表示該用戶屬於d中的一個組。你可以看到,甚至沒有使用連接或其他廣泛的查詢函數,但只返回大約100行的查詢需要2分鐘執行。

無論如何,我的問題只是這篇文章的標題。如果涉及的表中沒有定義索引,mysql查詢運行速度會慢一些嗎?

回答

2

是的!它會慢很多。

您需要在所有「ID」中加上索引。

,而且也應該重寫查詢,使用聯接(有助於優化)...

只是把指數出現後,你可以看到百倍的性能提升。

其他的事情,這樣的查詢說的是,以前開發商是「一個完整的白癡(TM)」

M.

+1

+1的話說,他是一個完整的白癡:) – lock 2010-03-23 02:42:53

1

答案是「這取決於細節,但更有可能不會更慢」。

索引允許您執行的操作是從磁盤讀取X%的數據,而不是100%(也稱爲表掃描)。

此外,您還需要運行要回答EXPLAIN隨時隨地「爲什麼我的查詢速度太慢」,以獲取必要的細節一個真正的解釋

0

沒有辦法知道肯定不知道在thew表中的數據分佈,以及查詢本身..但你幾乎可以保證它不會更快...

0

通常,是的...但是你必須定義你的索引到你正在運行的特定查詢。

它看起來像你的表都應該有你的id字段的索引,c應該對private的索引,a應該有對a.col_8可能的列值的索引。但是,要真正說明的唯一方法是使用EXPLAINDESCRIBE運行查詢以查看引擎如何執行它...

相關問題