1、什么是慢查询?
慢查询就是SQL执行时间过长,严重影响用户体验的SQL查询语句。当它频繁出现时数据库的性能和稳定性都会受到威胁
慢查询是数据库性能瓶颈的常见原因,是指SQL执行时间超过阈值;可能由于复杂的连接、缺少索引、不恰当的查询设计或数据量过大而导致变慢。
2、如何解决慢查询?
重写查询、添加或优化索引、调整数据库配置等
2.1、追踪慢查询
想要追踪慢查询,首先需要在mysql中有一个名为 long-query-time的配置项,它定义了慢查询的阈值。一旦SQL语句执行超过阈值,就会被标记为慢查询。通过一系列命令,我们可以轻松地查看、开启、关闭慢查询监控,并设置合适的阈值。当然,为了让这些配置永久生效,你还需要在 my.conf 文件中进行相应设置。
3、怎样提升性能?
通过添加索引来提升查询速度,并揭示索引失效的常见场景。掌握这些必备技能,你将能够轻松应对各种性能挑战,让数据库运行更加高效稳定。
3.1、添加索引提升查询速度
- 数据内存中比较相比mysql的查询产生io的耗时可忽略不计,所以查询速度取决于查询过程中的IO次数耗时,即提高查询次数的有效方法是减少IO次数(mysql的数据是存储在磁盘中)
- MYSQL innoDB引擎索引数据结构是B+tree结构(树节点称为数据叶)
- 每个数据叶默认大小为16kb(16384)(show VARIABLES like ‘innodb_page_size’;)
- 对于主键索引,假设一行数据1kb,则叶子可存16条数据。
- 当B+Tree的高度为h = 2 则数据量为 1170 * 16 = 18720条数据。
- 当B+Tree的高度为 h = 3 则数据量为1170 * 11170 * 16 = 21902400条数据(2190.24万)
- 对于非主键索引,则叶子节点的索引信息有 16384 /(8+8)= 1024个索引信息。
- 若h=2 则数据量为 1170 * 1024 = 1198080。
- 若h=3 则数据量为 117011701024 = 1401753600条数据(14亿零175.36万)。
- 假设我们用bigint做为主键索引大概占8个字节,(B+tree特点)有指向下一个的指针大概占6个字符,则每个数据叶可以存放的索引信息有 16384 / (8 + 6)= 1170个索引信息。
- 分析得出结论:
- 非主键索引,索引覆盖,
14亿
条数据情况下只需要3次io即可查询到想要的数据- 主键索引查询,
2190.24万
条数据情况下只走需要3次io
即可查询到想要的数据
3.2、索引失效场景
了解索引失效的场景,避免因SQL语句索引失效而引起的慢查询:
结语:
解决慢查询问题并非一蹴而就的过程,需要持续关注和不断优化。只有这样,你才能确保数据库始终保持在最佳状态,为业务发展提供强有力的支撑。