2011-05-10 142 views
0

我有兩個表A和B.A有大約2900萬行,而B是有大約1000行的臨時表。mysql選擇連接速度很慢

查詢是如下 -

select DISTINCT Table_A.column_a from Table_B join Table_A on Table_B.ID_b = Table_A.ID_a; 

我對(ID_A,column_a)

查詢大約需要20秒來運行綜合指數KEY2。

的解釋是如下 -

------------+ 
| id | select_type | table    | type | possible_keys       | key      | key_len | ref         | rows | Extra   | 
+----+-------------+-------------------+------+-----------------------------------------+---------------------------+---------+---------------------------------------+------+-----------------+ 
| 1 | SIMPLE  | Table_B   | ALL | NULL         | NULL      | NULL | NULL         | 1507 | Using temporary | 
| 1 | SIMPLE  | Table_A   | ref | key1 ,key2        | key2      | 3  | DB_name.Table_B.ID_b     | 963 | Using index  | 
+----+-------------+-------------------+------+-----------------------------------------+---------------------------+---------+---------------------------------------+------+-----------------+ 

如何優化這個查詢?

感謝

desc Table_A 
| id  | bigint(8) unsigned | NO | PRI | NULL | auto_increment | 
| column_a | mediumint(8) unsigned | NO | MUL |  |    | 
| column_1 | mediumint(8) unsigned | NO | MUL |  |    | 
| id_a  | mediumint(8) unsigned | NO | MUL |  | 
| column_2 | smallint(5) unsigned | NO | MUL | NULL |    | 
| column_3 | smallint(5) unsigned | NO |  | NULL |    | 
| column_4 | smallint(5) unsigned | NO | MUL | NULL |    | 
| column_5 | smallint(5) unsigned | NO |  | NULL |    | 
+0

讓表索引通過ID? – Luixv 2011-05-10 07:40:06

+0

你在Table_B.ID_b上有索引嗎? – 2011-05-10 07:40:52

+0

請發表您的表格結構,tkx – Neo 2011-05-10 08:00:39

回答

1

創建臨時表B中的索引,列ID_B,你should'nt得到了的「使用臨時在之後的‘額外’列,它應該會更好。使用CREATE INDEX語句。

+0

添加索引,但仍然看到使用臨時 – 2011-05-10 07:54:39

+0

@kkszysiu - 添加索引,但仍然看到使用臨時 – 2011-05-10 08:20:15

+0

@regilero - - 添加索引,但仍然看到使用臨時 – 2011-05-10 08:20:46

0

嘗試使用以下列(column_a)在表格A上創建索引

+0

我添加了一個索引和d說明仍然看起來相同 – 2011-05-10 07:52:47

+0

column_a上的索引已存在 – 2011-05-10 07:59:46

0

在列上添加適當的索引。解釋應該在那裏幫助,它應該加快你的查詢。

+0

Extra | + ---- + ------ + ------------------------------ + | 1 | SIMPLE | Table_B |索引| ID_index | ID_index | 3 | NULL | 1507 |使用索引;使用臨時|| 1 | SIMPLE |表_A | ref | key1,key2 | key2 | 3 | DB_name.Table_B.ID_b | 240 |使用索引 – 2011-05-10 07:57:50

+0

@kkszysiuExtra | + ---- + ------ + ------------------------------ + | 1 | SIMPLE | Table_B | index | ID_index | ID_index | 3 | NULL | 1507 |使用索引;使用臨時|| 1 | SIMPLE |表_A | ref | key1,key2 | key2 | 3 | DB_name.Table_B.ID_b | 240 |使用索引 - – 2011-05-10 08:19:33

0

不改變任何索引

編輯 我錯過了指數的順序,改變鍵2到(column_a,ID_A)

嘗試:

select DISTINCT Table_A.column_a 
from Table_A straight_join 
Table_B on Table_B.ID_b = Table_A.ID_a; 

PLS顯示解釋結果,TKX

+0

@Neo - 沒有幫助.-- + ------------------------------ + | 1 | SIMPLE |表_A |索引| key1,key2 | key2 | 6 | NULL | 29252089 |使用索引;使用臨時| | 1 | SIMPLE | Table_B | ref | ID_index | ID_index | 3 | DN_name.Table_A.ID_a | 1 |使用索引;不同 – 2011-05-10 08:51:59

+0

如何有關Table_A.column_a – Neo 2011-05-10 08:53:22

+0

選擇Table_A.column_a 從表-A STRAIGHT_JOIN 表-B上Table_B.ID_b = Table_A.ID_a組修改表-A索引鍵2到KEY2(column_a,ID_A) – Neo 2011-05-10 08:54:57