mysql选择连接速度很慢

问题描述:

我有两个表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

创建临时表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

尝试使用以下列(column_a)在表格A上创建索引

+0

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

+0

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

在列上添加适当的索引。解释应该在那里帮助,它应该加快你的查询。

+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

不改变任何索引

编辑 我错过了指数的顺序,改变键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