首页 > 数据库 >MySQL的查询优化思路

MySQL的查询优化思路

时间:2024-07-25 22:26:22浏览次数:12  
标签:事务 数据库 查询 索引 MySQL 思路 优化 主键

目录

前言

解决方案

减少查询

SQL优化

索引优化

减少锁

避免大事务

扩容

硬件升级


前言

一般的系统中,数据库往往都是性能瓶颈。在一个系统中,数据库被使用的频率很高,因为几乎所有的应用程序都需要与数据库交互来读取或写入数据。所以一旦数据库的响应慢,负载突增,则会大大影响系统的运行效率,严重点甚至可能直接崩溃。

面对数据库响应变慢,负载突增问题,应该及时处理,以下是处理的思路,依次考虑

  1. 减少查询
  2. SQL优化
  3. 索引优化
  4. 减少锁
  5. 避免大事务
  6. 扩容
  7. 硬件升级

解决方案

减少查询

减少查询时最优先考虑的优化步骤,具体的做法就是做一层缓存,每次请求优先从缓冲中读取,缓存中不存在数据再来查询数据库,这样能够有效地减少数据库查询的次数。

SQL优化

查询路径优化

使用limit提前终止查询

联表查询中使用小表驱动大表(实际上MySQL的查询优化器会自动优化)

查询语句优化

explain 检查查询语句是否走了索引

查询语句尽量做到索引覆盖,避免回表查询

索引下推:MySQL 5.7 的版本能在二级索引查询后先过滤再回表查询,减少了回表查询的次数 

索引优化

如果索引列数据量过大,只要索引列值足够散列,则可以只截取前面部分做索引

创建联合索引,应当根据索引列值的散列程度由高到低从左到右排列创建,创建联合索引后,叶子节点数据按索引列排序。在查询的时候,根据最左匹配原则,优先匹配最左边散列度最高的列,由于散列度足够高,匹配到的数据最为精确,范围最小,所以遍历时用的时间也最少。

减少锁

MySQL事务的默认隔离级别为 RR(REPEATABLE READ 可重复读)

为了不可重复度问题和部分幻读问题,在 RR 隔离级别下,除了会加 Record Lock(记录锁)外,还会加 Gap Lock(间隙锁)Next-key Lock(临键锁),使用了间隙锁和临键锁,就会使得所得粒度变大,发生死锁的概率也变大,支撑不了高并发业务场景。

为了提高并发度,可以将MySQL的事务隔离级别降为 RC(READ COMMITTED 读已提交)

在 RC 隔离级别下,只会添加 Record Lock(记录锁),只会对要修改的当前行加锁,粒度相比间隙锁和临键锁小了很多,因此能够提升并发度和降低死锁概率。

如果将事务隔离级别修改成 RC,则需要自己去处理事务中的不可重复读问题。在 RC 级别中,每次读取都会得到最新的数据,所以很有可能读取到其他事务提交的修改。

避免大事务

并不是事务中执行的语句很多才叫大事务,而是指运行时间很长的事务。即使事务中只有一条执行语句,但是这条执行语句执行时间很长,它就是一个大事务

不用非索引列来更新数据,会锁全表

尽可能用主键索引列来更新数据。

由于使用非主键索引,锁住非主键索引后还需要回表去锁住主键索引叶子节点中的数据。

在某些情况下,会发生死锁。

事务1事务2执行结构
begin
锁住id=1的主键索引success
begin
锁住id=2的主键索引success

锁住name=b的非主键索引

回表加锁id=2的主键索引

block
锁住name=b的非主键索引dead lock

删除数据时需先检查数据是否存在,因为删除一个不存在的数据,扫描索引后发现不存在,会加上间隙锁。

扩容

在以上措施都做了之后还是没法将很好降低数据库负载,那么还可以采用读写分离的技术方案,为MySQL做一个主从复制,主库处理写请求,从库处理读请求,根据读请求的并发量进行水平扩容,增加从库的数量。

MySQL的主从复制,可以实现读写分离,以及读库的水平扩容,将读请求分散到多个数据库中,从而降低单个数据库的负载,非常适用于读多写少的业务场景

硬件升级

最后,就是升级数据库服务器了,没有什么是升级硬件解决不了的。早点升级服务器,少整一些有的没的优化,早点下班,反正是老板出钱

标签:事务,数据库,查询,索引,MySQL,思路,优化,主键
From: https://blog.csdn.net/typeracer/article/details/140612576

相关文章

  • MySQL Sink 是否需要主键
    需要主键的情况:更新和删除操作:如果你希望MySQL表能够正确处理更新和删除操作,那么表中需要定义主键。主键用于唯一标识每一行数据,这样当Flink发送撤回消息(删除操作)或添加消息(更新操作)时,MySQL能够准确地找到并更新或删除对应的记录。数据一致性:主键有助于确保数据的一致性......
  • pymysql操作MySQL数据库(一)
    pymysql是Python中用于连接MySQL数据库并执行操作的库。一、操作流程连接数据库。需要获取数据库的相关配置信息db_info={'host':'127.0.0.1',#数据库的IP地址'port':3306,#端口号'user':'root',#数据库的连接账户'password':'12345......
  • MySQL基础练习20题,看看你的sql基础man不man
    数据获取表的数据信息(sql文件)放在这个链接里了,提取码:52xz,需要的自行提取。数据来自网上的练习,已经给小伙伴们总结好了。https://pan.baidu.com/s/11YMWaXtZb9K60cpOuYTwag将数据导入到mysql中大家可以直接在navicat运行该脚本,就可以直接导入数据了,如果遇到问题很可能是编码......
  • 基于javaweb+mysql数据库实现的宠物领养|流浪猫狗网站
    《基于javaweb+mysql数据库实现的宠物领养网站》该项目含有源码、文档等资料、配套开发软件、软件安装教程、项目发布教程等使用技术:前端使用技术:JSP,HTML5,CSS3、JavaScript等后台使用技术:Servlet、Jdbc等数据库:Mysql数据库项目功能介绍:本系统为基于jsp+mysql的宠物领养......
  • 数据库(MySQL)-DQL数据查询语言
        DQL(DataQueryLanguage数据查询语言)的用途是查询数据库数据,如select语句。其中,可以根据表的结构和关系分为单表查询和多表联查。单表查询    单表查询:针对数据库中的一张数据表进行查询全字段查询    语法:select字段名from表名#推荐s......
  • Day10--mybatis多表连接查询学习(一对一、一对多、多对多)
    MyBatis是一个优秀的持久层框架,支持将SQL语句、存储过程以及高级映射转换成Java对象。下面是MyBatis处理一对一、一对多、多对多关系的方式及相应的代码示例。数据库表假设有四个表:user、orders、role、user_role---->创建代码(占位较长)放在文章末尾···首先先了解对应......
  • 腾讯云 Debian12 安装MySQL8亲测可用
    今天刚好需要部署一台服务器,网上查了资料,折腾很久,还是很多问题,现在把我的安装过程以及遇到问题的解决方案记录下来,供大家借鉴!1、更新系统sudoaptupdate2、下载软件包wgethttps://repo.mysql.com/apt/debian/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-con......
  • mysql查询今天、昨天、本周、本月、上一月 、今年数据
    原文链接:https://www.cnblogs.com/cnsdhzzl/p/12724580.html--今天select*from表名whereto_days(时间字段名)=to_days(now());--昨天SELECT*FROM表名WHERETO_DAYS(NOW())-TO_DAYS(时间字段名)<=1--本周SELECT*FROM表名WHEREYEARWEEK(date_format......
  • 一文读懂MySQL数据表索引的类型、创建方法、维护要点
    引言索引是数据库中用于提高查询效率的重要机制。在数据库系统中,索引类似于书籍的目录,它可以帮助数据库系统快速地找到特定数据的位置,从而加快查询速度。通过合理地创建和管理索引,可以显著提升数据库的性能,提高数据检索的效率,降低系统的资源消耗。本文将详细介绍MySQL数据......
  • MySQL空闲会话超时之interactive_timeout 与wait_timeout
    背景描述在用MySQLClient链接MySQLServer进行操作的是偶,如果一段时间没有操作,可能会遇到以下错误:ERROR2006(HY000):MySQLserverhasgoneawayNoconnection.Tryingtoreconnect...或者ERROR2013(HY000):LostconnectiontoMySQLserverduringquery这个报错......