jjzjj

Mysql select on indexed column llowed on large tables

coder 2023-10-06 原文

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

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

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

select A.*, b2, b5, b7, b8, b10, b13, b33 from A join B on a1=b1 where b33 >= pos and b33 < pos+1000;

对于 b33 <= 600,000="" 的值,查询需要="" 1-5="" 秒。之后查询开始需要="" 20-30="" 秒。当="" b33="">= 8,000,000 时,查询开始需要 60-70 秒。我不明白为什么会出现放缓。 b33 已编入索引,连接发生在一个表中定义为主键且在另一个表中唯一的键上。有解决方法吗?这确实阻碍了代码的速度,如果没有其他方法,我将不得不将表 A 和 B 分成几个较小的表。我真的希望我不必那样做!请帮忙!

编辑:这是 EXPLAIN 的 o/p -

********* **** 1. 行 ******** *****
编号:1
选择类型:简单
表:B
类型:范围
possible_keys: b1,b33
键:b33
key_len: 4
引用:空
行数:981
额外:使用 where
************* 2. 行 *********** **
编号:1
选择类型:简单
表:A
类型:eq_ref
possible_keys:主要
键:主要
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 兆字节增加到几千兆字节产生了非常明显的差异。

如果您要从连接中涉及的任何表中删除许多行,您可以考虑运行 OPTIMIZE TABLE

关于Mysql select on indexed column llowed on large tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6248529/

有关Mysql select on indexed column llowed on large tables的更多相关文章

随机推荐