MySQL 性能优化
MySQL数据库优化设计的知识点很广,这里我主要将其划分为Schema、sql、index,硬件四方面谈谈自己的理解。
Schema
字段设计:吝啬的原则,Not Null,三个预留备用字段。
表的设计合理化,首先不得不提到三范式
- 字段不可分
- 所有非主键字段依赖主键字段
- 所有非主键字段不依赖其他非主键字段
三范式的目的时减少数据的冗余,但实际开发过程中为了提高查询效率等,适当保留冗余数据。
主从分离,垂直分区和水平分区。
sql
这里提一个生产遇到的问题,多表关联查询,包含多个join和子查询,这里我们可以将语句化繁为简,数据拼接等操作可以叫用程序语言本身来操作。
避免select *
limit offset,rows
充分利用表锁和行锁
慢查询日志,针对性优化
index
explain
type | 含义 |
---|---|
ALL | 全表扫描 |
index | 索引全扫描 |
range | 索引范围扫描 |
ref | 非唯一索引扫描 |
eq_ref | 唯一索引扫描 |
const,system | 单表最多有一个匹配行 |
Null | 不用扫描 |
一般来说,得保证查询至少达到range级别,最好能达到ref
组合索引和前缀索引
硬件
加机器配置,固态等