表结构设计方面
- 在满足业务条件下,数值类的字段使用占用小的数据类型;
- 主键ID使用unsigned储存
- 字符类型,只分配所需要类型;
- 字符类型字段尽量转换成数值类型存储;
- 设置索引的字段经量设置not null;
- 尽量少使用bolb和text,或者拆分出去;
- 控制核心表字段数量;
- 控制单表的数据量。
索引设计优化
- 索引不是建立越多越好,合理建立索引,索引建立跟业务sql相匹配;
- 索引建立区分度高;
- 建立索引字段尽可能小,或者使用前缀索引;
- 索引的字段不超过5个;
- 创建联合索引,避免冗余;
sql编写规范
- 尽量避免非操作,非操作不走索引;
- 不要在索引列做计算;
- where条件查询满足最左前缀原则;
- 查询字段按需查询,避免select *;
- where传入的值和字段定义的数据类型一致,避免隐试类型转换;
- 把or操作转成in
- 尽量避免大sql,把大sql拆解成简单sql。
分页优化
- 传统分页:Select * from table limit 10000,10;
- 这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略
- 程序取ID:select id from table limit 10000,10;
- Select * from table WHERE id in (123,456…);
子查询优化
mysql重写功能较弱,使用子查询较差的执行计划
查询执行计划,explain+select
type 索引类型
- ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
- index:Full Index Scan,index与ALL区别为index类型只遍历索引树
- range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
- ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
- eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
- const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量
- system是const类型的特例,当查询的表只有一行的情况下,使用system
- NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引
row 扫描行数 这两个字段查看执行计划的核心字段