我有一個SQL查詢,需要很長時間才能在MySQL上運行(這需要幾分鐘的時間)。該查詢是針對一個擁有超過1億行的表運行的,所以我並不驚訝它的速度很慢。理論上講,應該可以加快速度,因爲我真的只想從大表中取回行(我們稱之爲A),它在另一個表B中有引用。如何加快MySQL 4.1上的這個SQL查詢?
所以我的查詢是:
SELECT id FROM A, B where A.ref = B.ref;
(A有超過1億行; B有隻有幾千)。
我已經添加索引:
alter table A add index(ref);
alter table B add index(ref);
但它仍然很慢(幾分鐘 - 我很高興與一分鐘)。
不幸的是,我被困在MySQL 4.1.22,所以我不能使用視圖。
我寧願不將所有相關行從A複製到一個單獨的較小的表中,因爲我需要的行會不時更改。另一方面,目前這是我能想到的唯一解決方案。
歡迎任何建議!
編輯:下面是運行EXPLAIN我查詢的輸出:
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
| 1 | SIMPLE | B | ALL | B_ref,ref | NULL | NULL | NULL | 16718 | Using where |
| 1 | SIMPLE | A | ref | A_REF,ref | A_ref | 4 | DATABASE.B.ref | 5655 | |
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
(在redacting我原來的查詢示例,我選擇使用「參考」我的列名,而這恰好是一樣的該類型中的一種,但我希望這不是太混亂...)
你可以給我們輸出EXPLAIN SELECT嗎? –
Greg
2009-01-14 13:21:04
另外,嘗試在兩個表上運行OPTIMIZE – Greg 2009-01-14 13:29:58
OK - 我現在正在運行OPTIMIZE。稍後將添加EXPLAIN SELECT輸出。 – Ben 2009-01-14 13:40:17