首页 > 数据库 >MySQL慢查询(下):问题解决,应用总结

MySQL慢查询(下):问题解决,应用总结

时间:2022-11-11 13:36:20浏览次数:44  
标签:总结 SQL 扫描 查询 索引 MySQL 优化


上篇回顾

继上两篇:

  • ​​MySQL慢查询(上):你知道为啥会慢么?​​
  • ​​MySQL慢查询(中):正确的处理姿势,你get到了吗?​​

在以上两篇内容中,我们一起探索了这些内容:

  • SQL执行过程
  • 查询SQL为什么会慢
  • 如何定位查询问题
  • 几种实用解决方案介绍

如果将MySQL慢查询作为一个问题来拆解分析的话,之前上、中篇章算是问题分析、问题定位和解决,那今天来跟大家收下尾,聊聊MySQL慢查询问题解决经验总结。

MySQL慢查询(下):问题解决,应用总结_编程语言

废话不多说,直接开干~

高性能查询难题优化总结

我们来总结一下,应该如何处理高性能查询难题?

假如把高性能查询比作一个“难题”,它其实是包括多个子难题在内,共同作用的结果。

今天我们来归纳总结下,主要包括以下几类:

1 数据结构优化

良好的schema设计原则是普遍适用的,但是MySQL有他自己的实现细节要注意,概况来讲,尽可能保持任何东西小而简单总是好的。

主要有以下简单的原则值得你去考虑使用:

  • 尽量避免过度设计
  • 使用小而简单的合适数据类型,尽可能避免使用null
  • 尽量使用相同的数据类型存储相似或者相关的值
  • 注意可变长字符串,其在临时表和排序时可能按最大长度分配内存
  • 尽量使用整形定义标识符

MySQL慢查询(下):问题解决,应用总结_编程语言_02

2 索引设计优化

常见的B-Tree索引,按照顺序存储数据,所以MySQL可以用来做ORDER BY 和 GROUP BY操作。因为数据是有序的,所以便于将相关的列值都存储在一起。由于索引中存储了实际的列值,所以一些查询只通过索引就能够完成查询(如:聚簇索引)。

根据索引的特性,总结索引的优点有如下几点:

  • 减少服务器需要扫描的数据量;
  • 帮助服务器避免排序和临时表;
  • 将随机I/O变为顺序I/O。

编写查询语句时候应该注意尽可能选择合适的索引,以避免单行查找,尽可能使用索引覆盖。

根据执行计划依次扫描相关表中的行,不在数据缓冲区的走IO存储引擎扫描表的性能消耗参考下面的list,消耗从大到小:

全表扫描>全索引扫描>部分索引扫描>索引查找>唯一索引/主键查找>常量/null

MySQL慢查询(下):问题解决,应用总结_mysql_03

3 应用查询优化

应用查询优化是建立在良好的数据结构和合理的索引设计之上的。

它主要包括以下几种情况:

3.1 重构查询方式

优化慢查询时,目标应该是找到一个更优的方案来达到我们获取结果数据的目的。其中可以存在多样的权衡方案:

1)从数据库中查询计算直接获取到结果数据;

2)拆分多条子查询来逐步得到结果数据;

3)从数据库获取到基础数据,然后应用代码逻辑加工后获得结果数据。

3.2 让SQL尽量符合查询优化器的执行要求

MySQL 查询优化器并不是对所有查询都适用的,我们可以通过改写查询 SQL 来让数据库更高效的完成工作。

常见查询应用优化建议汇总如下:

1)对于任何查询,应尽量避免全表扫描

    首先应考虑在 where 及 order by 涉及的列上建立并应用索引;

2)尽量避免在 where 子句中进行操作

    使用 or 来连接条件、对字段进行 null 值判断、匹配查询 '%abc%'、!= 或 <> 操作符,否则将导致引擎放弃使用索引而进行全表扫描;

    对字段进行表达式、函数操作,这将导致引擎放弃使用索引而进行全表扫描;

3)尽量应用索引

    使用索引字段作为条件时,如果是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致;

4)索引字段要注意慎重选取

    索引尽量避开区分度不大的字段,如:sex、male、female 

    这种五五开的索引列有大量数据重复时,那么即使在 sex 上建了索引也对查询效率起不了作用。

5)一个表的索引数最好不要超过 6 个

    索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率, 因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。

6)尽量使用数字型字段

    若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。 这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

7)尽量避免使用 *

    select * from table ,用具体的字段列表代替 *,不要返回用不到的任何字段,尤其是多表关联查询的情况。

MySQL v5.6版本以后,消除了很多MySQL原本的限制,让更多的查询能够以尽可能高的效率完成。

MySQL慢查询(下):问题解决,应用总结_java_04

小结

良好的表结构设计是高性能查询的基石,恰当的索引设计是高性能查询的助推器,同时合理的查询应用也是必不可少的。数据结构优化、索引设计优化及应用查询优化犹如三叉戟一般,齐头并进,在高性能查询应用中缺一不可。

写在最后

全文总结一下,其实就是我们要学会用数据库的要求方式来执行SQL

即要写好应用查询SQL,必须要结合良好的数据结构和合理的索引设计才可以。

其实MySQL查询优化中的每一项拆开讲都可以是很大的章节,在此主要是将解决问题的思路分享给大家,希望能对大家今后的工作中能有所帮助。

最后,感谢大家的持续关注~

附:闻道有先后,所有的技术成长无外乎不断的温习基础+实践锤炼,关注回复关键【MySQL】,即可获取《高性能MySQL 第3版》PDF电子书 ~

- END -

MySQL慢查询(下):问题解决,应用总结_java_05


公号文章主要来自于个人日常工作问题总结思考,相信问题及解决方案均具有普适性,希望同大家一起学习成长。

同时和一些志同道合的小伙伴们建了一个技术交流群,一起探讨技术、共同学习进步,如果感兴趣就加入我们吧!


Thanks for reading!

标签:总结,SQL,扫描,查询,索引,MySQL,优化
From: https://blog.51cto.com/u_15107509/5844753

相关文章

  • MySQL慢查询(上):你知道为啥会慢么?
    正文共: 2487字 6图  预计阅读时间: 7分钟发现的一些问题问题1在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路......
  • 查询openmp的版本
    vimtest.cpp#include<unordered_map>#include<cstdio>#include<omp.h>intmain(intargc,char*argv[]){std::unordered_map<unsigned,std::string>map{{200......
  • 踩坑 MySQL 索引,看看你真的会用吗?
    关于MySQL索引,对于研发同学,尤其是后端研发同学,一定不会陌生。我们工作中经常会用到MySQL数据库,就肯定会经常用到性能优化方面的设计和考量,常常用涉及到MySQL索引。但......
  • 用实例带你了解 MySQL 全局锁
    MySQL全局锁会申请一个全局的读锁,对整个库加锁。全局锁的一般使用场景是:全局逻辑备份。全局锁的实现方式有两种://第一种方法Flushtableswithreadlock(FTWRL)//第二种方法......
  • 【转】内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
    堆和栈的区别一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈......
  • 【MySQL(八)】一致性非锁定读 锁定读 解析
    一致性非锁定读与锁定读的区别主要针对的是读操作在加锁方式上的差别。这里先看下锁的分类吧。mysql的行锁分为读锁与写锁。读锁即S锁,也叫共享锁,当事务读取一行数据时,会尝试......
  • 【MySQL(三)】buffer pool相关
    bufferpool是一种减少磁盘io读的机制,原理是将访问过的磁盘数据暂留在内存中,这样下次访问相同的数据就不需要读磁盘了。这个思想在平时的开发中,也经常用到,比如我们通常会在......
  • 【MySQL(十九)】复制 过程
    主库将数据写入本地binlog文件中;从库连接,指定起始位置;主库的binlogdump线程开始将binlog内容发送给从库;从库的io线程将收到的binlog内容写入到本地的relaylog中;从库的sql......
  • MySQL启动报错[ERROR] InnoDB: Trying to access page number 4294967295 in space 0,
    这篇文章是原来的《记一次mysql故障处理》,但是随着mysql问题越来越多,我感觉还是集合到一篇里面比较好,也方便之后问题复现的查找一、记一次mysql故障处理最近遇到的问......
  • MySQL备库复制延迟的原因及解决办法【转】
    背景今天有同事问我主从复制延迟会影响高可用切换的RTO怎么办,这个不需要做实验,我可以直接回答,所以有了以下赶鸭子的文章,都是一线运维经验之谈,建议四连:点赞、收藏、转发......