MySQL SQL和索引优化总结

article/2025/11/6 4:24:36

文章目录

    • 一、SQL语句和索引的优化
    • 二、应用优化
    • 三、MySQL Server优化
      • 1. 自适应哈希索引
      • 2. redo log
      • 3. MySQL查询缓存
      • 4. 索引和数据缓存
      • 5. MySQL线程缓存
      • 6. 并发连接数量和超时时间

首先我们需要知道MySQL主要是从以下3个方面进行优化:

  • SQL语句和索引
  • 应用优化(引入缓存、连接池)
  • 配置参数优化

一、SQL语句和索引的优化

当数据量比较大,若SQL语句写的不合适,会导致SQL的执行效率低,我们需要等待很长时间才能拿到结果

在这里插入图片描述
针对性优化的时候,若数据量太大,可通过limit分页

explain分析的时候可能出现以下问题:

  • 没有用索引
  • 用多列索引没有用到第一列,导致没用到索引
  • 联合查询的大小表设置不合理,导致索引没用上(小表是整表查询,大表才用索引)
  • 多表查询不用in(产生中间表),用外连接替代带in子查询的过程,合理使用索引

二、应用优化

除了优化SQL和索引,在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对上层的应用来进行一些优化,使得上层应用访问数据库的压力能够减到最小

  1. 引入数据库连接池;防止客户端不断三次握手建立连接,四次挥手关闭连接,耗费网络以及服务器资源,我们可以引入数据库连接池,这是高并发场景下常用的一种优化手段(需要设置初始连接量,最大连接量以及最大空闲时间等参数)
  2. 引入缓存;用于存储热点数据,如果客户端的请求来了,先在redis上查一下(redis是基于内存的数据库),如果redis上直接查到就不经过MySQL数据库,如果没有查到就去访问MySQL数据库,访问MySQL完成后,先把当前访问的数据往redis上缓存一下,再把结果返回给用户

引入redis缓存的话,也会有一些附带的问题:缓存数据一致性问题,缓存穿透和缓存雪崩等等

三、MySQL Server优化

对于MySQL Server端的优化,主要指的是MySQL Server启动时加载的配置文件(my.ini或my.cnf)中配置项的优化

1. 自适应哈希索引

由于hash索引的生成和维护也是耗费性能的,通过以下命令查看自适应哈希索引搜索的频率低于使用二级索引树搜索的频率:

show engine innodb status\G

在这里插入图片描述

如果使用自适应哈希索引搜索的频率较低,可以通过变量innodb_adaptive_hash_index关闭自适应哈希索引

2. redo log

可以根据物理机的条件,合理设置InnoDB log buffer大小(redo log缓存的大小),Innodb_buffer_pool_size(缓存的大小),来减少磁盘I/O次数,因为缓存区大了,在缓冲区工作的时间就长了,redo log的效率就高了

my.cnf配置参数如下:
在这里插入图片描述

3. MySQL查询缓存

MySQL的查询缓存是把上一次select的查询结果记录下来放在缓存当中,下一次再查询相同内容的时候,直接从缓存中取出来就可以了,不用再进行一遍真正的SQL查询(在内存中划分一块空间用做缓存的地方)

查询缓存适用于更新不频繁的表,查询频繁的表,因为当两个select查询中间出现insert,update,delete语句的时候,查询缓存就会被清空,过多的查询缓存的数据添加和删除,就会影响MySQL的执行效率,可能还不如每次都从磁盘上查询

可以通过以下命令,来查看查询缓存的设置:

在这里插入图片描述
如果某个表的查询多而更改少,可以考虑开启查询缓存

通过show status命令,可以查看MySQL查询缓存的使用状况,如下:

在这里插入图片描述

可以通过set命令设置上面的缓存参数开启MySQL查询缓存功能,也可以找到MySQL的配置文件(windows是my.ini,linux是my.cnf),修改query_cache_type参数为1就可以了,然后重启MySQL Server就可以使用了,如下:

在这里插入图片描述

MySQL查询缓存还是不如使用redis,这是MySQL的查询缓存,我们作为MySQL服务的使用者来说,控制不了MySQL的缓存方式,如果我们引入redis的话,可以通过redis提供的API精确控制要缓存的数据,以及不缓存的数据

4. 索引和数据缓存

主要指的就是innodb_buffer_pool_size配置项,从名字上就能看到,该配置项是针对InnoDB存储引擎起作用的,这个参数定义了InnoDB存储引擎的表数据和索引数据的最大内存缓冲区大小。innodb_buffer_pool_size是同时为数据块和索引块做缓存,这个值设的越高,访问表中数据需要的磁盘I/O就越少

innodb_buffer_pool_size = 402653184  -- 384M

5. MySQL线程缓存

主要指配置文件中thread_cache_size配置项

MySQL Server网络模块采用经典的select I/O复用+线程池模型,之所以引入线程池,主要就是为了在业务执行的过程中,不会因为临时创建和销毁线程,造成系统性能降低,因为线程的创建和销毁是很耗费性能的

线程池就是在业务使用之前,先创建一组固定数量的线程,等待事件发生,当有SQL请求到达MySQL Server的时候,在线程池中取一个线程来执行该SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(线程池的线程数量随着请求越来越多,是可以动态增加的)

在这里插入图片描述

配置完thread_cache_size,重启MySQL Server服务后即可生效

6. 并发连接数量和超时时间

MySQL Server作为一个服务器,可以设置客户端的最大连接量和连接超时时间,如果数据库连接统计数量比较大,这两个参数的值需要设置大一些

在这里插入图片描述
在配置文件(my.cnf或my.ini)最下面,添加配置:max_connections=1000,然后重启MySQLServer,配置生效

MySQL Server对于长时间未通信的连接,会主动关闭连接。设置超时时间,超过设置时间没有请求就主动断开,单位是秒,在配置文件中添加配置:wait_timeout = 600

在这里插入图片描述


http://chatgpt.dhexx.cn/article/5IMI7JlK.shtml

相关文章

mysql嵌套子查询索引_SQL 子查询,索引优化

场景 索引优化 单列索引 多列索引 索引覆盖 排序 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 数据100条 学生表: create table Student( id int PRIMARY KEY, name varchar(10) ) 数据70000条 …

索引如何优化

前言 索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率? 此篇文章详细的讲述了索引优化的几个原则,只要在工作中能够随时应用到&#xff0c…

MySQL高级-索引优化(超详细)

性能分析 MySQL Query Optimizer Mysql中由专门负责优化SELECT语句的优化器,主要功能就是通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(他认为最优的,但**不一定是DBA觉得最优的&#xff0…

mysql locate索引_MYSQL索引优化

1.查看sql的执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。show [session|global] status 可以根据需要加上参数“session”或者“global”来显示 session 级(当前连接)的计结果和 global 级(自数据库上次启动至今)的统计结…

索引优化详解

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果…

索引优化原则

1、全值匹配 查询语句尽量使用全值匹配。 2、左前缀原则 如果一个索引是组合索引,索引了多列,要遵循左前缀原则,即查询从索引的左前缀开始,不能跳过索引中间的列。 3、不要在索引列上操作 操作包括:计算、函数、自动…

项目中常用的MySQL优化你知道多少?

项目中常用的MySQL优化 文章目录 项目中常用的MySQL优化前言一、mysql优化是什么?二、优化步骤1.EXPLAIN2.SQL语句中IN包含的值不应太多3.SELECT语句务必指明字段名称4.如果排序字段没有用到索引,就尽量少排序5.如果限制条件中其他字段没有索引&#xff…

一文带你你搞懂索引如何优化!!!

前言 索引的相信大家都听说过,但是真正会用的又有几人?平时工作中写SQL真的会考虑到这条SQL如何能够用上索引,如何能够提升执行效率?此篇文章详细的讲述了索引优化的几个原则,只要在工作中能够随时应用到,相…

使用AJAX实现数据的增删改查

主页&#xff1a;index.html <!DOCTYPE html><html> <head> <meta charset"UTF-8"> <title></title> <script src"http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script> </head> <body…

合肥工业大学数据库上机实验3(第3次实验)

大三上学期的实验了&#xff0c;一直没来得及放到博客上面&#xff0c;博主所在学校的数据库实验都很简单。&#xff08;不明白为什么截图上传之后为什么那么糊&#xff09; 文章目录 实验9&#xff1a;触发器的创建与使用1. 实验目的2. 实验要求3. 实验内容4. 实验步骤5. 实验…

第三章课后题

3.有两个关系S(A,B,C,D)和T(C,D,E,F)&#xff0c;写出与下列等价的SQL表达式。 &#xff08;1&#xff09; σ A 10 ( S ) \sigma_{A10}(S) σA10​(S) 对行的选择&#xff0c;列全部显示。 SELECT * FROM S WHERE A10;&#xff08;2&#xff09; Π A , B ( S ) \Pi_{A,B}(…

SQL 数据库上机实验(查询操作)

大二数据库上机实验 实验一实验二 实验一 实验步骤&#xff1a; 1&#xff1a;创建数据库“shiyan2”&#xff1b; 2&#xff1a;创建数据表’s’,’p’,’j’&#xff1b; 3&#xff1a;创建数据表’spj’并设定’sno’,’pno’,’jno’三列为外键&#xff0c;分别关联于s表的…

实验3 SQL的复杂多表查询以及视图

第1关 查询所有“红色”的15公斤及以上的零件名 任务描述 查询所有“红色”的15公斤及以上的零件名 相关知识 零件表P由零件代码&#xff08;PNO&#xff09;、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成&#xff1b; P表如下图&#xff1a; 现已构建P表&#xff0c;结构信…

【系统分析师之路】第十五章 复盘数据库系统(关系数据库应用)

【系统分析师之路】第十五章 复盘数据库系统&#xff08;关系数据库应用&#xff09; 复盘数据库系统—关系数据库应用 【系统分析师之路】第十五章 复盘数据库系统&#xff08;关系数据库应用&#xff09;前言部分 历年真题考点分析1&#xff09;考点分析2&#xff09;重要知识…

数据库系统概论练习3

一、填空题 能够唯一标识实体的属性或属性组称为____实体的码______。如果两个关系没有公共属性&#xff0c;则其自然联接操作与____笛卡尔积_____操作等价。SQL中聚合函数“COUNT&#xff08;*&#xff09;”的功能是___统计元组个数________。关系模式如果为1NF&#xff0c;则…

数据库第七周作业——第三章课后习题

3.有两个关系S&#xff08;A,B,C,D&#xff09;和T&#xff08;C,D,E,F&#xff09;,写出与下列查询等价的SQL表达式&#xff1a; (1&#xff09;σ A10(S&#xff09; SELECT * FROM S WHERE A10;(2&#xff09;π A , B ( S ) SELECT A,B FROM S;(3&#xff09;S ⋈ T SEL…

第三章作业【数据库原理】

第二章作业【数据库原理】 前言推荐第三章作业第3章第1题简答题第3章第2题&#xff08;关系代数->SQL代码&#xff09;第3章第3题&#xff08;创建SPJ数据库中的四张表&#xff09;模拟数据第3章第4题&#xff08;SPJ数据库上完成查询&#xff09;第3章第5题&#xff08;SPJ…

设有一个工程供应数据库系统,包括如下四个关系模式:S(Sno,Sname, Status,City) ;P(Pno,Pname,Color ,Weight);J(Jno,Jname, Ci

设有一个工程供应数据库系统&#xff0c;包括如下四个关系模式&#xff1a; S(Sno&#xff0c;Sname&#xff0c; Status&#xff0c;City) &#xff1b; P(Pno&#xff0c;Pname&#xff0c;Color &#xff0c;Weight)&#xff1b; J(Jno&#xff0c;Jname&#xff0c; City) …

高通WLAN框架学习(17)-- NIO和PNO

本章详细介绍了preferred network offload (PNO)扫描概述、流、模式和配置文件。 18.1 PNO扫描概述 WLAN STA在通过AP模组连接AP之前,需要偶尔对环境进行扫描。 在WLAN请求程序中对扫描结果进行解析和处理,以确定是否至少有一个目标(附近)AP在附近。 为了偶尔发出扫描,应用…

Wi-Fi PNO扫描流程(Android P)

简介&#xff1a;当手机灭屏情况下&#xff0c;有保存网络时&#xff0c;若已连接&#xff0c;不扫描&#xff0c;否则&#xff0c;PNO扫描&#xff0c;即只扫描已保存的网络。最小间隔min20s&#xff0c;最大间隔max20s*360s PNO 即Preferred Network Offload&#xff0c;用于…