mysql慢怎么办 mysql太慢( 二 )


显然,关联子查询的扫描成本会高于非关联子查询 。
我们希望 MySQL 能先"缓存"子查询的结果(缓存这一步叫物化 , MATERIALIZATION),但MySQL 认为不缓存更快,我们就需要给予 MySQL 一定指导 。
...
可以看到执行时间变成了 0.67s 。
整理
我们诊断的关键点如下:
\1. 对于 information_schema 中的元数据表,执行计划不能提供有效信息 。
\2. 通过查看 MySQL 改写后的 SQL,我们猜测了优化器发生了误判 。
\3. 我们增加了 hint,指导 MySQL 正确进行优化判断 。
但目前我们的实验仅限于猜测,猜中了万事大吉 , 猜不中就无法做出好的诊断 。
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使用count(*)命令慢的解决方案【mysql慢怎么办 mysql太慢】笔者目前在负责一个简单的Spring Boot项目mysql慢怎么办,该项目有一个操作日志的功能 。在分页查询操作日志时,需要查询日志的记录数 。日志记录也不大,23W左右 , 比起其mysql慢怎么办他大项目一两百W,少很多了 。但是,令人困惑的是,使用count(*)查询总数时 , 总是十分缓慢,在20s左右 , 使得打开操作日志非常慢 。
于是mysql慢怎么办我改成了count(1)、count(id),然而都不行 。
网上资料说MySQL对count(*)做了特别的优化,按理来说应该是最快的,然而三个都不约而同的非常慢 。
解决方案是,为ID加了个唯一键mysql慢怎么办:
之后再使用count(*)便能正常查询了:
对于这个问题的原因,依旧没能想明白为什么 。欢迎大家相互讨论~

推荐阅读