我有两个表:A-301列(第一个列名为a1 int(11)主键,第二个至301th-double(15,11))和B-33列(第一个列-b1 int(11)Unique Key,第二个一个-b2 varchar(100)主键,...,33rd-b33 int(11)MUL)。

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

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



对于b33 = 8,000,000时,查询开始耗时60-70s。我不明白为什么会发生减速。 b33已建立索引,并且连接发生在一个表中定义为主键而在另一个表中定义为唯一键的键上。有没有解决方法?这确实在妨碍代码的速度,如果没有其他方法,我将不得不将表A和B分成几个较小的表。我真的希望我不必这样做!请帮忙!

编辑:这是说明的o/p-

************* 1.行 *************
编号:1
select_type:简单
表:B
类型:范围
可能的键:b1,b33
键:b33
key_len:4
引用:NULL
行:981
额外:在哪里使用
************* 2.行 *************
编号:1
select_type:简单
table :A
类型:eq_ref
可能的键:PRIMARY
关键:主要
key_len:4
引用:DBName.B.b1
行数:1
额外的:
设置2行(0.00秒)

最佳答案

由于您的数据库有数百万条记录,您是否正在采取任何措施使数据库保持良好状态?

如果您的数据经常更改(可能很多插入,也许吗?),则每晚运行以下命令可能有助于提高整体响应能力:
mysqlcheck --check --analyze --auto-repair --all-databases --silent
尽管我会在运行命令之前建议reading up a bit on mysqlcheck,但是这样您才能知道它在做什么。

您还应该查看optimizing your InnoDB configuration,尤其是innodb_buffer_pool_size(您可以赋予它的内存越多越好)。我在类似大小的表中的基于日期的字段(当然,我们立即将其索引)上遇到了类似的缓慢情况,并且将缓冲池大小从默认的8 MB增加到了几GB,这产生了非常明显的差异。

如果要从该联接所涉及的任何表中删除许多行,则也可以考虑运行 OPTIMIZE TABLE

关于MySQL在大型表上对索引列的速度进行选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6248529/

10-12 12:41