2009-01-14 65 views
0

我有一個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我原來的查詢示例,我選擇使用「參考」我的列名,而這恰好是一樣的該類型中的一種,但我希望這不是太混亂...)

+0

你可以給我們輸出EXPLAIN SELECT 嗎? – Greg 2009-01-14 13:21:04

+0

另外,嘗試在兩個表上運行OPTIMIZE – Greg 2009-01-14 13:29:58

+0

OK - 我現在正在運行OPTIMIZE。稍後將添加EXPLAIN SELECT輸出。 – Ben 2009-01-14 13:40:17

回答

2

查詢優化器可能已經做了最好的,它可以,但萬一,它的讀取巨人表(A)首先,你可以明確告訴它首先讀取B使用在STRAIGHT_JOIN語法:

SELECT STRAIGHT_JOIN id FROM B, A where B.ref = A.ref; 
1

從答案,好像你正在做的最有效的事情,你可以用SQL。 A表似乎是一個大問題,那麼如何將它分成三個單獨的表,有點像本地版本的分片?或者,假設B沒有太多列,是否值得將B表格非規範化到A表格中?

最後,你可能只需要購買一個更快的盒子來運行它 - 這是無可替代的馬力!

祝你好運。