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