2010-07-21 88 views
2

我有兩個表(MYISAM)MySQL的加入是很慢

create table A (email varchar(50)); 
create table B(email varchar(50) key 'email' (email)); 

表A具有130K記錄 表B已經20K記錄

爲什麼這條SQL語句花費很長的時間(超過兩個分鐘,然後我按Ctrl + C中止查詢) 語句是:

select count(*) from user A, tmp B where A.email=B.email; 

由於

+0

哪個版本?哪個引擎?是的,索引A.email會更好... – pascal 2010-07-21 15:05:59

+0

爲什麼你要做一個多選擇而不是左連接? 我想我錯過了這裏的意思... 你可以做一個「描述」兩​​個表併發布結果? 查詢中的「解釋」也有幫助。 – Andreas 2010-07-21 15:37:50

回答

2

我猜猜查詢優化器沒有什麼可繼續。爲什麼不嘗試在電子郵件列上定義索引。

+0

表A是另一個項目,我不允許做任何改變:( 然而這是我在解釋 | ID | select_type |表| type | possible_keys |鍵| key_len | ref | rows | filtered | Extra | | 1 | SIMPLE | B |索引| NULL |電子郵件| 53 | NULL | 21401 | 100.00 |使用索引| | 1 | SIMPLE | A | ALL | NULL | NULL | NULL | 136437 | 100.00 |使用where;使用連接緩衝區| – Alaa 2010-07-21 15:03:27

+4

如果您不在A.email上添加索引,數據庫引擎將始終在運行此查詢時執行全表掃描。如果您不允許使用此查詢,則無法對其執行任何操作添加索引。 – a1ex07 2010-07-21 15:12:06

0

通常,連接字符串比連接像int這樣的較短數據類型要昂貴。

您可以通過確保兩個電子郵件列都已建立索引來加速此查詢。

0

如果表A有一個int ID字段,那麼表B應該存儲該ID而不是再次存儲電子郵件字符串。這會減少數據庫的大小,並且與索引一起提供比字符串所能提供的更快的查詢速度。