mysql查询慢除了索引问题还会是因为什么?

2024-09-02 00:20

本文主要是介绍mysql查询慢除了索引问题还会是因为什么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

作为一个程序员SQL查询慢的问题在工作和面试中都是会经常遇到的问题, 一般情况下我们都会联想到索引问题, 那么除了索引问题还有什么其他的场景会导致SQL查询慢呢?

MySQL执行查询逻辑

例如我们使用可视化工具执行这样一条SQL: select * from user_info where age = 10;

 首先可视化工具会携带mysql的用户名和密码与mysql建立连接, 然后执行select * from user_info where age = 10; 此条SQL会通过网络连接发送给mysql数据库, 数据库中的SQL分析器会先分析SQL是否有语法错误, 语法分析通过后会进入规则优化器, 规则优化器会对SQL进行分析选择该用什么索引,优化完毕后就会进入到SQL执行器,SQL执行器会调用存储引擎的接口函数来进行查询, 然后将查询到的数据返回给客户端

这里着重讲一下存储引擎

MySQL一般情况下我们都会选择InnoDB

InnoDB

我们知道如果直接查询磁盘内的数据是比较慢的, 索引InnoDB给自己加了一个缓存区BufferPool,用来实现快速查询, BufferPool中既有行数据又有索引数据

 BufferPool的原理与我们使用redis进行缓存差不多, 首先会先通过规则优化器中选择的索引到BufferPool中进行查询, 如果没有则先从磁盘中查询出来然后放到BufferPool中, 行数据也同理, 如果BufferPool中没有则从磁盘中查询放入到行数据中

SQL查询慢的原因

SQL规则优化器选错索引

一般情况下导致SQL慢的原因都是因为SQL规则优化器选择错索引导致的, 这类问题可以通过explain命令进行排查, 排查过程就不详细介绍了

连接数过小

这个问题可以举一个例子, 比如mysql现在只能建立一个连接, 但是我有多条SQL需要执行, 因此MySQL只能一条一条来执行, 如果可以建立多个链接这样就可以并发执行效率会快很多, 这种问题一般会受到服务端和客户端两方面的制约, Mysql服务端默认的最大连接数是100, 可以通过执行命令 set global max_connections=500; 将最大连接数改为500

应用端链接数过小

前面提到了服务端链接数过小, 那么应用端如果配置的连接数过小也会导致查询慢, 原理是因为应用端与服务端通信需要建立TCP长连接, 而建立长连接开销较大因此应用端会维护一个连接池, 每次需要有SQL执行的时候会从连接池中捞出一条TCP链接,用完之后再放回连接池, 如果此连接池的数量设置太小也会导致如同服务端一样的SQL需要排队查询的情况

BufferPool太小

前面介绍InnoDB的时候提到了BufferPool, 它会缓存磁盘中的数据, 加速查询,也就是说如果BufferPool越大那么能放的数据也就越多, 那么SQL查询时就更有可能命中BufferPool自然查询速度就更快, 因此我们可以通过更改BufferPool的大小来加速查询

那么问题来了, 如果不是因为BufferPool小导致的查询慢我们修改BufferPool的大小是毫无意义的, 所以我们怎么确定是BufferPool的问题呢?

可以通过sql命令: show status like 'Innodb_buffer_pool_%'命令来查询, 查询完毕我们可以看到一些数据, 我们可以通过 (读取磁盘次数/请求次数)来计算BufferPool的命中率, 一般情况下BufferPool的命中率在99%以上, 只要命中率高于这个值那么BufferPool的大小就是正常的

这篇关于mysql查询慢除了索引问题还会是因为什么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128468

相关文章

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t