2012-12-12 45 views
1

我在舊的mysql數據庫上運行查詢,許多查詢花費的時間比他們應該的要長。比如這一次,ad_vehicle有60000行,id_ad_link有25000爲什麼這個簡單的左連接永遠執行?

SELECT * FROM autotalk_identicar_old.ad_vehicle 
left join autotalk_identicar_old.id_ad_link on autotalk_identicar_old.ad_vehicle.vehiclekey=autotalk_identicar_old.id_ad_link.rbvehiclekey; 

持續時間爲2.323秒,取擊中執行(使用MySQL工作臺,不知道有什麼差別,雖然)後,仍在12分鐘。運行在一個虛擬機與我的amd四核3.4 GHz的3核心與1GB內存

我不認爲有任何索引/主鍵,但是,這會產生如此大的差異? ad_vehicle的

排第幾id_ad_link的

A145 00AA, PV, ALFA, 145, 2000, 3HBm, 1.6, , , , , P, , 5, 1596, , , 32995, , , 3HBm 1.6p 
A145 00AB, PV, ALFA, 145, 2000, 3HBm, 1.7, , , , , P, , 5, 1712, , , 41995, , , 3HBm 1.7p 
A145 01AA, PV, ALFA, 145, 2001, 3HBm, 1.6, , , , , P, , 5, 1596, , , 32995, , , 3HBm 1.6p 
A145 01AB, PV, ALFA, 145, 2001, 3HBm, 1.7, , , , , P, , 5, 1712, , , 41995, , , 3HBm 1.7p 
A145 02AA, PV, ALFA, 145, 2002, 3HBm, 1.6, , , , , P, , 5, 1596, , , 32995, , , 3HBm 1.6p 
A145 02AB, PV, ALFA, 145, 2002, 3HBm, 1.7, , , , , P, , 5, 1712, , , 41995, , , 3HBm 1.7p 
A145 95AA, PV, ALFA, 145, 1995, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L 
A145 95AB, PV, ALFA, 145, 1995, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L 
A145 96AA, PV, ALFA, 145, 1996, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L 
A145 96AB, PV, ALFA, 145, 1996, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L 
A145 97AA, PV, ALFA, 145, 1997, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L 
A145 97AB, PV, ALFA, 145, 1997, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L 
A145 98AA, PV, ALFA, 145, 1998, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L 
A145 98AB, PV, ALFA, 145, 1998, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L 
A145 98AC, PV, ALFA, 145, 1998, 4SDm, 2.5, , , , , P, , 5, 2492, , , 65998, , , 4SDm 2.5p 
A145 99AA, PV, ALFA, 145, 1999, 3HBm, 1.7, ELEGANTE, L, , , P, , 4, 1712, , , 41995, , , 3HBm 1.7p ELEGANTE L 
A145 99AB, PV, ALFA, 145, 1999, 3HBm, 1.6, , L, , , P, , 4, 1596, , , 32995, , , 3HBm 1.6p L 
A146 00AA, PV, ALFA, 146, 2000, 5HBm, 1.6, , TS, , , P, , 5, 1596, , , 37995, , , 5HBm 1.6p TS 
A146 01AA, PV, ALFA, 146, 2001, 5HBm, 1.6, , TS, , , P, , 5, 1596, , , 38995, , , 5HBm 1.6p TS 

排第幾

4 10 DHJT 94AA 1994 REDUNDANT HIJET 
12 971 A33 95AA 1995 REDUNDANT ALFA33 
13 971 A33 95AB 1995 REDUNDANT ALFA33 
14 971 A33 95AC 1995 REDUNDANT ALFA33 
61 973 A146 95AB 1995 REDUNDANT 146 
60 973 A146 95AA 1995 REDUNDANT 146 
59 973 A145 02AB 2002 REDUNDANT 145 
58 973 A145 02AA 2002 REDUNDANT 145 
57 973 A145 01AB 2001 REDUNDANT 145 
56 973 A145 01AA 2001 REDUNDANT 145 
55 973 A145 00AB 2000 REDUNDANT 145 
54 973 A145 99AB 1999 REDUNDANT 145 
53 973 A145 99AA 1999 REDUNDANT 145 
52 973 A145 98AC 1998 REDUNDANT 145 
45 973 A145 95AB 1995 REDUNDANT 145 
44 973 A145 95AA 1995 REDUNDANT 145 
70 973 A146 98AB 1998 REDUNDANT 146 
71 973 A146 98AC 1998 REDUNDANT 146 
72 973 A146 99AA 1999 REDUNDANT 146 
73 973 A146 00AA 2000 REDUNDANT 146 

UPDATE:

這裏的

explain SELECT * FROM autotalk_identicar_old.ad_vehicle 
left join autotalk_identicar_old.id_ad_link on autotalk_identicar_old.ad_vehicle.vehiclekey=autotalk_identicar_old.id_ad_link.rbvehiclekey; 

id, select_type, table,  type, possible_keys, key, key_len, ref, rows, Extra 
'1', 'SIMPLE', 'ad_vehicle', 'ALL',  NULL,  NULL, NULL, NULL, '60433', '' 
'1', 'SIMPLE', 'id_ad_link', 'ALL',  NULL,  NULL, NULL, NULL, '25571', '' 
+1

您可以在執行時發佈這兩個結果嗎? 'DESC ad_vehicle;'和'DESC id_ad_link'。此外,'解析SELECT * FROM autotalk_identicar_old.ad_vehicle left autotalk_identicar_old.id_ad_link autotalk_identicar_old.ad_vehicle.vehiclekey = autotalk_identicar_old.id_ad_link.rbvehiclekey;' –

+2

絕對地,任何列用於連接各個表的索引都會提高性能。建立這些,然後再次嘗試查詢。 – DRapp

+0

編輯的問題,結果是'explain ...' –

回答

5

結果嘗試在創建索引該外鍵:

create index id_ad_link_rbvehiclekey_index on id_ad_link(rbvehiclekey); 

沒有這個指數,ad_vehicle每一行都會對id_ad_link全表掃描。
隨着的索引,ad_vehicle的每一行都會導致一些索引頁被訪問(可能是內存中),並且因爲索引存儲頁來找到行。

最小化磁盤I/O對性能至關重要,因爲它至少比內存操作慢1000倍。

索引有很大的不同,特別是用於連接的列(如外鍵)

+0

我只能說WOW ...我聽說過提及主鍵和索引加速數據庫,但我從來沒有想到它會有如此巨大的差異! 60819行返回|持續時間0.000獲取1.108。謝謝你好,先生:) –

+0

只是出於好奇,我會假設MySQL會將整個表加載到內存中,然後再處理它......考慮到它很容易<1Mb –

+0

是的,我知道你的意思。我不知道它在封面下使用的是什麼實現,但也許這只是它選擇不做的事情 – Bohemian

相關問題