mysql如何优化

server/2024/9/24 16:29:29/

 

explain

id:序列号,越大优先级越高,相同从上往下执行 null最后执行

select_type简单simple  复杂的查询:primary  subquery   derived   union

table:表

type:null > system > const > eq_ref > ref > range > index > all

  1. null 优化阶段分解查询语句,执行阶段不需再访问表/索引
  2. const/system 优化转常量
  3. eq_ref:primary key/ unique key部分数据被连接使用,最多返回一条符合条件的记录
  4. ref: 普通索引/唯一索引前缀
  5. range范围扫描in / between  /  > / <  / >= 
  6. all全表扫描,从头到尾查找需要的行

possible_keys:可能使用哪些索引

key实际使用的索引,无null 强制使用/忽略possiblekey,force index ignor index

key_len在索引使用的字节数,具体使用了哪些列

ref:关联的字段,const 字段名   

rows:估计要读取 检索的行数

extra:

  • using index覆盖索引
  • using index condition 索引下推,索引过滤 where再过滤
  • usnig where使用where处理结果 查询的列未被索引覆盖 全表扫描   
  • using temporary临时表,建索引 
  • using filesort外部排序,磁盘完成 
  • select tables optimized away聚合函数max min访问索引某个字段

char(n)n个字节 / varchar(n) 2n,utf-8 3n+2  /  tinyint 1 / smallint  2  /  int  4 /  bigint  8

date 3 /  timestamp 4字节 / datetime8字节 / 字段容许null  1字节记录是否为null

索引最大长度768字节,过长 截取提取字符     

mysql缓冲鸡肋:语句本身稍有不同则清空;数据变化清空

优化:

避免子查询:小表 嵌 大表,可用join优化

in替换or:in中的常量存储在排好序的数组中(不宜大),连续值用between

    in先执行子查询,外表大内表小

exists:外表先被访问,外表小 内表大

union all:明确没有重复数据,union结果集进行唯一性过滤(排序  cpu消耗延迟)

order by:无排序要求禁止排序order by null,排序字段无索引/分组统计 🈲️

group by: 无排序 order by null

      explain无using temporary 适当调大tmp_table_size,实在太大SQL_BIG_RESULT

      避免用having(检出all记录后过滤结果 需要排序分组) where提前过滤 

尽量使用数字型字段:字符串需逐个对比 数字对比一次

join:

  • t1 join t2,t1无索引2有 index nexted-loop join NLJ,explain什么都没写用的是NLJ

       t1读取数据R 关联字段到t2查找 ,满足条件行 R组成一行 结果集

  • t2无索引block nested-loop join BLJ,先读取到join_buffer内存中,t1放buffer,t2依次比较
  • simple nested-loop joinSLJ,顺序去t1数据去t2全表匹配,成功作为结果集返回

被驱动表t2的join字段建索引,不能 则足够的join_buffer_size

减少left join(默认大表驱动小表 t1过滤变小t2加索引)

inner join自动的选择小表驱动大表,推荐的

临时表

排序:

  待排序字段 放到sort buffer,排完返回

  • 全字段排序,查询返回的字段 放入sortbuffer,排完返回
  • rowid排序,需要排序的字段 放入sortbuffer 回表 返回
  • max_length_for_sort_data控制哪一种

having

对返回的结构集操作

 先执行where —— groupby分组 —— 聚集函数 —— having 子句

索引优化

索引列不做操作:计算 函数(5.8增加函数索引 函数计算后到值建立索引)

字符串带‘’,字符串与数字比较 字符串转为数字 进行比较

    select * from user where id = CAST(“1” AS signed int) 函数作用在值可走索引

尽量使用覆盖索引

负向查询 != / <> / not in / not exists / not like 无法使用索引

is null / is not null 无法使用索引,高版本可以

少用or,where子句 or前后都是索引列 才能用索引(分别使用然合并)

mycat没有自己的数据库引擎

   server.xml 、schema.xml、 rule.xml 、log4j2.xml

《深入理解mysql

mysql必知必会》

实践中如何优化MySQL(精)_mysql优化-CSDN博客

看一遍就理解:数据库group by详解_数据库_程序员小灰-GitCode 开源社区

explain详解和索引最佳实践-CSDN博客


http://www.ppmy.cn/server/27945.html

相关文章

python按时间分割日志

背景介绍 现在的项目都是RotatingFileHandler,指定每个文件大小,指定日志文件的份数。有一个缺点就是要看某一天的日志,需要把这一天之前的最后一份日志和这一天之后的第一份日志都拷贝下来,很多不是自己想要的内容。 需求 想要一个按时间,最好能按天分割日志。查看Pyth…

Daz Install Manager 安装daz表情包 表情动画

当然可以&#xff01;以下是关于使用 Daz Install Manager (DIM) 安装插件的入门教程&#xff1a; 第一步&#xff1a;安装 Daz Install Manager (DIM) 从官方网站下载 Daz Install Manager (DIM) 安装程序。运行安装程序&#xff0c;按照提示完成安装。通常建议保持默认安装…

树莓派点亮LED灯

简介 使用GPIO Zero library 的 Python库实现点亮LED灯。接线 树莓派引脚参考图如下&#xff1a; LED正极 接GPIO17 LED负极 接GND 权限 将你的用户加到gpio组中&#xff0c; 否则无法控制GPIO sudo usermod -a -G gpio 代码 from gpiozero import LED from time impor…

Qt 配置 FFmpeg

进入 GitHub&#xff0c;下载带 shared 后缀的那个包即可 我将下载好的文件夹改名为 FFmpeg并将 FFmpeg 文件夹放在 Program Files 目录下 下载好后将 bin 添加到系统环境中 C:\Program Files\FFmpeg\bin若用 QMake 构建项目 在配置文件 pro 中 添加到文件末尾就行 FFMPEG_HO…

前端安全:XSS和CSRF攻击的防御策略

在前端开发中&#xff0c;确保应用的安全性是至关重要的任务之一。跨站脚本攻击&#xff08;XSS&#xff09;和跨站请求伪造&#xff08;CSRF&#xff09;是两种常见的安全威胁&#xff0c;它们可以严重危害网站的安全和用户的隐私。以下是针对这两种攻击的防御策略&#xff1a…

11、Flink 的 Keyed State 详解

1.Keyed DataStream 使用 keyed state&#xff0c;首先需要为DataStream指定 key&#xff08;主键&#xff09;&#xff1b;这个 key 用于状态分区&#xff08;数据流中的 Record 也会被分区&#xff09;可以使用 DataStream 中 Java/Scala API 的 keyBy(KeySelector) 或者是 …

陪同口译VR情景实训教学系统开发

陪同口译VR情景实训教学系统应用教学系统是一款针对口译培训而设计的教学软件&#xff0c;它利用虚拟现实技术&#xff0c;为学生提供身临其境的口译模拟场景&#xff0c;帮助他们提高口译技能和实际应用能力。 一、口译模拟场景&#xff1a; 该系统包含多种不同类型的口译场景…

附录3-小程序常用事件

目录 1 点击事件 tap 2 文本框输入事件 input 3 状态改变事件 change 4 下拉刷新事件 onPullDownRefresh() 5 上拉触底事件 onReachBottom() 1 点击事件 tap 2 文本框输入事件 input 可以使用 e.detail.value 打印出当前文本框的值 我现在在文本框中依次输入12345&…