1.一条 Sql 语句查询一直慢会是什么原因2.一条 Sql 语句查询偶尔慢会是什么原因3.为什么 VarChar 建议不要超过2554.删除表数据后表的大小却没有变动,这是为什么5.主从延迟要怎么解决6.buffer pool 是做什么的7.Sql 调优思路
1.一条 Sql 语句查询一直慢会是什么原因「1.没有用到索引」
比如函数导致的索引失效,或者本身就没有加索引「2.表数据量太大」
考虑分库分表吧「3.优化器选错了索引」
「考虑使用」 force index 强制走索引
2.一条 Sql 语句查询偶尔慢会是什么原因
「1. 数据库在刷新脏页」
比如 「redolog 写满了」,「内存不够用了」释放内存如果是脏页也需要刷,mysql 「正常空闲状态刷脏页」「2. 没有拿到锁」
3.为什么 VarChar 建议不要超过255
当定义varchar长度小于等于255时,长度标识位需要一个字节(utf-8编码)
当大于255时,长度标识位需要两个字节,并且建立的「索引也会失效」
4.删除表数据后表的大小却没有变动,这是为什么在使用 delete 删除数据时,其实对应的数据行并不是真正的删除,是「逻辑删除」,InnoDB 仅仅是将其「标记成可复用的状态」,所以表空间不会变小
5.主从延迟要怎么解决1.并行复制,通过sql线程转换为多个work线程
2.提高机器性能
3.分库分表
4.避免长事务
5.避免让数据库进行各种大量运算
6.对于一些对延迟很敏感的业务, 直接让主库读取
buffer pool 是一块内存区域,为了「提高数据库的性能」,当数据库操作数据的时候,把硬盘上的数据加载到 buffer pool,不直接和硬盘打交道,操作的是 buffer pool 里面的数据,数据库的增删改查都是在 buffer pool 上进行
buffer pool 里面缓存的数据内容也是一个个数据页
1.free链表:用于帮助我们找到空闲的缓存页
2.flush链表:用于找到脏缓存页,也就是需要刷盘的缓存页
3.lru链表:用来淘汰不经常被访问的缓存页,分为热数据区和冷数据区,冷数据区放的是不常被访问的数据
预读机制:
Buffer Pool 有一项特技叫预读,存储引擎的接口在被 Server 层调用时,会在响应的同时进行预判,将下次可能用到的数据和索引加载到 Buffer Pool
7.Sql 调优思路
1.表结构优化
1.1拆分字段
1.2字段类型的选择
1.3字段类型大小的限制
1.4合理的增加冗余字段
1.5新建字段一定要有默认值
索引方面
2.1索引字段的选择
2.2利用好mysql支持的索引下推,覆盖索引等功能
2.3唯一索引和普通索引的选择
Sql语句优化
3.1避免索引失效
3.2合理的书写where条件字段顺序
3.3小表驱动大表
3.4可以使用force index()防止优化器选错索引
分库分表



