Mysql调优

分库分表

分库分表很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,做法是将其散列到100个表中。

修改表结构

不停机修改mysql表结构,同样还是members表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大

索引的建立

索引应建立在那些将用于JoinWhere判断和orderBy排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。

sql语句执行顺序

select -> wherer -> group by -> having -> order by

explain

参考链接:MySQL explain 应用详解(吐血整理🤩) - SegmentFault 思否

使用优化器可以模拟优化器执行SQL查询语句,从而知道MySQL怎么处理你的SQL语句的,分析你的查询语句和表结构的性能瓶颈。

explain能够干什么?
  • 读取表的顺序
  • 哪些索引能够被使用
  • 数据读取操作的操作类型
  • 哪些索引能够被实际使用
  • 表之间的引用
  • 每张表有多少行被物理查询

explain的使用,如下所示:

1
explain select * from course;

输出如下:

image-20210924144139921

explain各个字段代表的意思:
  • id :select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
  • select_type :查询类型 或者是 其他操作类型
  • table :正在访问哪个表
  • partitions :匹配的分区
  • type :访问的类型
  • possible_keys :显示可能应用在这张表中的索引,一个或多个,但不一定实际使用到
  • key :实际使用到的索引,如果为NULL,则没有使用索引
  • key_len :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度
  • ref :显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
  • rows :根据表统计信息及索引选用情况,大致估算出找到所需的记录所需读取的行数
  • filtered :查询的表行占表的百分比
  • Extra :包含不适合在其它列中显示但十分重要的额外信息
Id与table
  1. id相同时,执行顺序由上至下
  2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
  3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
select_type字段
  • SIMPLE 简单查询,不包括子查询和union查询
  • PRIMARY 当存在子查询时,最外面的查询被标记为主查询
  • SUBQUERY 子查询
  • UNION 当一个查询在UNION关键字之后就会出现UNION
  • UNION RESULT 连接几个表查询后的结果
partitions字段

该列显示的为分区表命中的分区情况。非分区表该字段为空(null)。

type字段

首先说一下这个字段,要记住以下10个状态,(从左往右,越靠左边的越优秀)

1
NULL > system > const > eq_ref > ref > ref_or_null > index_merge > range > index > ALL
  • NULL:MySQL能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引
  • system:表只有一行记录(等于系统表),这是const类型的特列,平时不大会出现,可以忽略。
作者

bd160jbgm

发布于

2021-09-24

更新于

2021-09-24

许可协议