mysql查询瓶颈怎么办 mysql查询慢是为什么 怎么改善

mysql springboot jpa查询几十万条数据很慢 如何解决?将查询语句放到服务器命令行去跑,如果慢,则可以考虑通过添加索引来提高查询速度 。
如已有索引或添加索引后查询速度仍未改善,查看语句执行计划中,是全表扫描还是走索引 。如果走了索引,那就可能考虑是服务器性能瓶颈或数据库设置问题,涉及的设置项比较多,你没有提供相关信息,无法继续提供优化建议 。如果没有走索引 , 检查语法(查询条件添加函数不走索引)和表属性(关联表字符集不统一不走索引) 。
如果服务器本地快,但页面查询慢,那就排除了性能问题 , 考虑网络问题与页面查询语句调用的驱动模块是否有问题 。检测网络连接速度 , 如慢尝试更换网线 。网络连接速度正常,则尝试更换调用的驱动包,重新下一个或换一个版本 。
mysql支持几十万的数据,响应速度应该是毫秒级的 。
看了下你的语句 , 不要用IN了,改INNER JOIN吧,套那么多层IN,肯定没效率 。
如果mysql里面的数据过多,查询太慢怎么办?问题
我们有一个 SQLmysql查询瓶颈怎么办,用于找到没有主键 / 唯一键的表,但是在 MySQL 5.7 上运行特别慢,怎么办?
实验
我们搭建一个 MySQL 5.7 的环境 , 此处省略搭建步骤 。
写个简单的脚本 , 制造一批带主键和不带主键的表mysql查询瓶颈怎么办:
执行一下脚本mysql查询瓶颈怎么办:
现在执行以下 SQL 看看效果:
...
执行了 16.80s , 感觉是非常慢了 。
现在用一下 DBA 三板斧 , 看看执行计划:
感觉有点惨,由于 information_schema.columns 是元数据表 , 没有必要的统计信息 。
那我们来 show warnings 看看 MySQL 改写后的 SQL:
我们格式化一下 SQL:
可以看到 MySQL 将
select from A where A.x not in (select x from B) //非关联子查询
转换成了
select from A where not exists (select 1 from B where B.x = a.x) //关联子查询
如果我们自己是 MySQL , 在执行非关联子查询时,可以使用很简单的策略:
select from A where A.x not in (select x from B where ...) //非关联子查询:1. 扫描 B 表中的所有记录,找到满足条件的记录,存放在临时表 C 中 , 建好索引2. 扫描 A 表中的记录,与临时表 C 中的记录进行比对,直接在索引里比对,
而关联子查询就需要循环迭代:
select from A where not exists (select 1 from B where B.x = a.x and ...) //关联子查询扫描 A 表的每一条记录 rA:扫描 B 表,找到其中的第一条满足 rA 条件的记录 。
显然 , 关联子查询的扫描成本会高于非关联子查询 。
我们希望 MySQL 能先"缓存"子查询的结果(缓存这一步叫物化,MATERIALIZATION) , 但MySQL 认为不缓存更快,我们就需要给予 MySQL 一定指导 。
...
可以看到执行时间变成了 0.67s 。
整理
我们诊断的关键点如下:
\1. 对于 information_schema 中的元数据表,执行计划不能提供有效信息 。
\2. 通过查看 MySQL 改写后的 SQL,我们猜测了优化器发生了误判 。
\3. 我们增加了 hint,指导 MySQL 正确进行优化判断 。
但目前我们的实验仅限于猜测,猜中了万事大吉,猜不中就无法做出好的诊断 。
如何查看 mysql 性能瓶颈通过sysbench的oltp_read_write测试来模拟业务压力、以此来给指定的硬件环境配置一份比较合理的MySQL配置文件 。
【mysql查询瓶颈怎么办 mysql查询慢是为什么 怎么改善】环境介绍
硬件配置
请点击输入图片描述
软件环境
请点击输入图片描述
优化层级与指导思想
优化层级
MySQL数据库优化可以在多个不同的层级进行,常见的有:
SQL优化
参数优化
架构优化
本文重点关注:参数优化
指导思想
日志先行 -- 一个事务能否成功提交的关键是日志是否成功落盘,与数据没有太大的关系;也就是说对写的优化可以表述为各方面的资源向写操作倾斜 。
瓶颈分析 -- 通过show global status 的各个计数器的值基本上就能分析出当前瓶颈所在 , 再结合一些简单的系统层面的监控工具如top iostat 就能明确瓶颈 。
整体性能是“读”“写”之间的再平衡 。
MySQL查询效率很慢的问题如何分析和解决MySQL 在崩溃恢复时,会遍历打开所有 ibd 文件的 header page 验证数据字典的准确性 , 如果 MySQL 中包含了大量表 , 这个校验过程就会比较耗时 。MySQL 下崩溃恢复确实和表数量有关,表总数越大 , 崩溃恢复时间越长 。另外磁盘 IOPS 也会影响崩溃恢复时间,像这里开发库的 HDD IOPS 较低 , 因此面对大量的表空间,校验速度就非常缓慢 。另外一个发现,MySQL 8 下正常启用时居然也会进行表空间校验,而故障恢复时则会额外再进行一次表空间校验,等于校验了 2 遍 。不过 MySQL 8.0 里多了一个特性,即表数量超过 5W 时,会启用多线程扫描 , 加快表空间校验过程 。
如何跳过校验MySQL 5.7 下有方法可以跳过崩溃恢复时的表空间校验过程嘛?查阅了资料,方法主要有两种:
1. 配置 innodb_force_recovery可以使 srv_force_recovery != 0,那么 validate= false,即可以跳过表空间校验 。实际测试的时候设置 innodb_force_recovery =1,也就是强制恢复跳过坏页 , 就可以跳过校验,然后重启就是正常启动了 。通过这种临时方式可以避免崩溃恢复后非常耗时的表空间校验过程 , 快速启动 MySQL,个人目前暂时未发现有什么隐患 。2. 使用共享表空间替代独立表空间这样就不需要打开 N 个 ibd 文件了,只需要打开一个 ibdata 文件即可,大大节省了校验时间 。自从听了姜老师讲过使用共享表空间替代独立表空间解决 drop 大表时性能抖动的原理后,感觉共享表空间在很多业务环境下 , 反而更有优势 。
临时冒出另外一种解决想法,即用 GDB 调试崩溃恢复 , 通过临时修改 validate 变量值让 MySQL 跳过表空间验证过程,然后让 MySQL 正常关闭,重新启动就可以正常启动了 。但是实际测试发现 , 如果以 debug 模式运行,确实可以临时修改 validate 变量,跳过表空间验证过程,但是 debug 模式下代码运行效率大打折扣,反而耗时更长 。而以非 debug 模式运行 , 则无法修改 validate 变量,想法破灭 。
关于mysql查询瓶颈怎么办和mysql查询慢是为什么 怎么改善的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读