mysql选择加入非常慢

时间:2011-05-10 07:34:32

标签: mysql

我有两个表A和B.A有大约2900万行,B是一个临时表,大约有1000行。

查询如下 -

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

我有一个复合索引key2(ID_a,column_a)

查询大约需要20秒才能运行。

解释如下 -

------------+
| 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 |                |

4 个答案:

答案 0 :(得分:1)

在临时表B,列ID_b上创建一个索引,你不应该再获得“在”额外“列中使用临时值,它应该更好。使用CREATE INDEX声明。

答案 1 :(得分:0)

尝试使用以下列(column_a)

在tableA上创建索引

答案 2 :(得分:0)

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

答案 3 :(得分:0)

不要更改任何索引

EDIT 我想念索引的顺序,将key2更改为(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;

请显示解释结果,tkx