MySQL查询效率很慢的问题如何分析和解决

发布网友 发布时间:2022-04-22 04:31

我来回答

3个回答

懂视网 时间:2022-04-07 18:48

(推荐教程:mysql视频教程)

mysql数据库中如何数据表太大,则查询会变慢,那么这要如何优化呢?下面本篇文章给大家介绍一下mysql数据库表太大查询慢的优化方法,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

mysql数据库表太大查询慢优化

1、合理建立索引

通常查询利用到索引比不用索引更快,通过explain 可查看索引是否被使用.具体explain使用方法,如

http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html

当查询包含group by时 而group by字段属于索引字段时,如果查询结果不能通过group by松散或紧凑索引而决定,group by操作就会建立临时表根据文件排序(Using temporary; Using filesort)来得到结果,往往性能更低,但也不是绝对的,即使利用到了索引也不一定比没用到查询更快。

2、建立分区

对关键字段建立水平分区,比如时间字段,若查询条件往往通过时间范围来进行查询,能提升不少性能。

3、建立粗粒度数据表

根据查询建立对应的表,定时对重复的记录进行压缩转存至新表,粒度变大,数据记录变少。

4、利用缓存

利用缓存将一次查询“得来不易”的数据缓存住一段时间,从而提高效率。

更多编程相关知识,请访问:编程视频!!

热心网友 时间:2022-04-07 15:56

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 变量,想法破灭。

热心网友 时间:2022-04-07 17:14

建议开启mysql的慢日志查询功能,在看下是否是因为某些SQL查询耗时过长导致,然后在优化下SQL。如果SQL本身没有太大问题,那就可能需要考虑网络和硬件这块了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com