Mysql选择对大表的索引列减速

aye*_*129 5 mysql indexing select join slowdown

我有两个表:A - 301列(第一个名为a1 int(11)主键,第二个到第301个 - 双(15,11))和B - 33列(第一个 - b1 int(11)唯一键,第二个One - b2 varchar(100)主键,...,33rd - b33 int(11)MUL).

A和B都有约13,500,000条记录.

我的mysql查询:对于pos的每个值,以集合(1,1000,2000,...,13500000)中的pos为1000的倍数:

在a1 = b1上从A连接B中选择A.*,b2,b5,b7,b8,b10,b13,b33,其中b33> = pos,b33 <pos + 1000;

对于b33 <= 600,000的值,查询需要1-5秒.之后,查询开始耗时20-30秒.当b33> = 8,000,000时,查询开始花费60-70秒.我无法理解为什么减速正在发生.b33被索引,并且连接发生在一个表中定义为primary而另一个表中唯一的键上.这有解决方法吗?这实际上阻碍了代码的速度,如果没有别的办法,我将不得不将表A和B分成几个较小的表.我真的希望我不必那样做!请帮忙!

编辑:这是EXPLAIN的o/p -

************* 1.行*************
id:1
select_type:SIMPLE
表:B
类型:范围
possible_keys:b1,b33
键:b33
key_len :4
ref:NULL
行:981
额外:使用where
************* 2. row *************
id:1
select_type:SIMPLE
表:A
type:eq_ref
possible_keys:PRIMARY
键:PRIMARY
key_len:4
ref:DBName.B.b1
rows:1
Extra:
2行in set(0.00 sec)

Sam*_*uel 0

我不是MySQL(或任何东西!)专家,但我会考虑一些事情。首先,b33分布均匀吗?可能会因为有效地检索更多行而变慢?其次,您是否考虑过在单个查询中完成所有工作而不是 13500 次?就像是:

select A.*, b2, b5, b7, b8, b10, b13, b33, (b33 - 1 DIV 1000) the_group
from A join B on a1=b1 
Run Code Online (Sandbox Code Playgroud)

第三,大胆猜测,如果您的 MySQL 版本支持,请先使用内联视图进行过滤:

select A.*, b2, b5, b7, b8, b10, b13, b33 
from A join (select b1,b2, b5, b7, b8, b10, b13, b33 
             from B b33 >= pos and b33 < pos+1000) B_NEW 
     on a1=b1 ;
Run Code Online (Sandbox Code Playgroud)

第四(应该是第一个),制定一个解释计划,并尝试通过比较快速查询和慢速查询来了解查询速度慢的原因。

祝你好运!!