两张3百多万的表关联查询速度优化

现象:表A数据量310多万,表B数据量320多万,A left join B执行时间超10分钟无结果
优化经过:
1、网上有人说tmp_table_size的值太小,查看tmp_table_size

show variables like '%tmp%';  
 ---218KB确实有些小
调整tmp_table_size大小:
set global tmp_table_size=512*1024*1024;

2、测试,超10分钟无结果
3、查看join_buffer_size的值

show variables like '%join%'; 

—忘记具体是多少了,不大,然后调整成了8M

set global tmp_table_size=8*1024*1024;

4、测试,依然超10分钟无结果
5、查看执行计划

explain select a.handno from A left join B on a.handno=b.handno

type:index
possible_keys:NULL
key_len:82
rows分别是:3100000 、3200000
6、尝试inner join,查看执行计划

explain select a.handno from A inner join B on a.handno=b.handno

type分别是:index eq_ref
possible_keys:NULL PRIMARY
key_len分别是:82 62
rows分别是:3100000 、1
执行语句2分钟左右可以查询出结果,那说明按着这个执行计划就可以出结果,inner join可以很快查询出结果,而left join却不行,突然想到两个表调换下位置关联
7、查看执行计划

explain select b.handno from B left join A on b.handno=a.handno

type分别是:index eq_ref
possible_keys:NULL PRIMARY
key_len分别是:82 62
rows分别是:3200000 、1
8、换一下位置就可以,可能是跟表结构有关系,查看两张表的建表语句,发现有区别的地方有两个:一是表的存储索引不同A是INNODB,B是MyISAM,二是表A的建表语句里有参数Row_Format=DYNAMIC
9、重新创建表A,存储引擎设为MyISAM,去掉Row_Format=DYNAMIC,再次查看执行计划,执行计划如下:type分别是:index eq_ref
possible_keys:NULL PRIMARY
key_len分别是:82 62
rows分别是:3100000 、1
10、但是MyISAM存储引擎不适合大数据量的表,调整表的存储引擎为INNODB,再次查看执行计划,执行计划无变化,可以在2分钟左右查询出结果

alter table A engine=InnoDB;
alter table B engine=InnoDB;

注:执行计划详解参考
https://blog.csdn.net/weixin_41558728/article/details/81704916

另:记录一下,mysql的format:
在mysql中, 若一张表里面不存在varchar、text以及其变形、blob以及其变形的字段的话,那么张这个表其实也叫静态表,即该表的row_format是fixed,就是说每条记录所占用的字节一样。其优点读取快,缺点浪费额外一部分空间。
若一张表里面存在varchar、text以及其变形、blob以及其变形的字段的话,那么张这个表其实也叫动态表,即该表的row_format是dynamic,就是说每条记录所占用的字节是动态的。其优点节省空间,缺点增加读取的时间开销。
所以,做搜索查询量大的表一般都以空间来换取时间,设计成静态表。
row_format还有其他一些值:
DEFAULT
FIXED
DYNAMIC
COMPRESSED
REDUNDANT
COMPACT

修改行格式:
ALTER TABLE table_name ROW_FORMAT = DEFAULT

修改过程导致:
fixed—>dynamic: 这会导致CHAR变成VARCHAR
dynamic—>fixed: 这会导致VARCHAR变成CHAR

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对多关联查询优化,可以考虑以下几个方面: 1. 索引优化:确保参与关联的列上有合适的索引,以加快查询速度。可以通过使用主键、唯一索引、组合索引等方式来优化。 2. 避免全扫描:尽量避免在关联查询中使用不带有索引的列,这会导致全扫描,影响性能。可以通过添加索引或者调整查询条件来避免全扫描。 3. 合理使用JOIN语句:选择合适的JOIN类型,如INNER JOIN、LEFT JOIN等,根据实际情况来确定。还可以根据需求调整关联的顺序,将数据量较小的放在前面,以减少关联操作的数据量。 4. 使用子查询或临时:对于复杂的关联查询,可以考虑使用子查询或者临时优化性能。将复杂的查询拆分成多个简单的子查询,可以减少关联操作的数据量。 5. 避免重复查询:如果某个查询中需要多次关联同一张,可以考虑将结果缓存起来,避免重复查询。可以使用临时或者应用程序级别的缓存来实现。 6. 适当使用索引覆盖:在查询中只选择需要的列,避免不必要的列查询,可以减少IO操作,提高查询性能。 7. 数据库优化:定期进行数据库优化工作,如结构优化、统计信息更新、磁盘碎片整理等,以保持数据库的性能。 以上是一些常见的优化方法,具体的优化策略还需要根据具体的业务需求和数据库结构进行调整和优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值