Mysql优化

70 阅读2分钟

表结构设计方面

  1. 在满足业务条件下,数值类的字段使用占用小的数据类型;
  2. 主键ID使用unsigned储存
  3. 字符类型,只分配所需要类型;
  4. 字符类型字段尽量转换成数值类型存储;
  5. 设置索引的字段经量设置not null;
  6. 尽量少使用bolb和text,或者拆分出去;
  7. 控制核心表字段数量;
  8. 控制单表的数据量。

索引设计优化

  1. 索引不是建立越多越好,合理建立索引,索引建立跟业务sql相匹配;
  2. 索引建立区分度高;
  3. 建立索引字段尽可能小,或者使用前缀索引;
  4. 索引的字段不超过5个;
  5. 创建联合索引,避免冗余;

sql编写规范

  1. 尽量避免非操作,非操作不走索引;
  2. 不要在索引列做计算;
  3. where条件查询满足最左前缀原则;
  4. 查询字段按需查询,避免select *;
  5. where传入的值和字段定义的数据类型一致,避免隐试类型转换;
  6. 把or操作转成in
  7. 尽量避免大sql,把大sql拆解成简单sql。

分页优化

  1. 传统分页:Select * from table limit 10000,10;
  2. 这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略
  3. 程序取ID:select id from table limit 10000,10;
  4. Select * from table WHERE id in (123,456…);

子查询优化

mysql重写功能较弱,使用子查询较差的执行计划

查询执行计划,explain+select

type 索引类型

  1. ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行
  2. index:Full Index Scan,index与ALL区别为index类型只遍历索引树
  3. range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
  5. eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
  6. const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量
  7. system是const类型的特例,当查询的表只有一行的情况下,使用system
  8. NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引

row 扫描行数 这两个字段查看执行计划的核心字段