跳到主要内容

MySQL 性能优化

哪些字段作为索引?

  1. 具有唯一性的字段,例如学号。 (唯一索引)
  2. 频繁作为 where 查询条件的字段。
  3. 经常 group by 和 order by 的列
  4. update、delete 的 where 列
  5. distinct 字段需要创建索引
  6. 多表 join
    • 连接的表尽量不超过 3 张
    • where 条件创建索引
    • on 连接字段创建索引
  7. 使用列的类型小(数据范围小,tinyint、mediumint、int、bigint)的创建索引
  8. 字符串很长时,使用字符串前缀创建索引
  9. 区分度高的列适合作为索引
  10. 使用最频繁的列放到联合索引的左侧
  11. 在多个字段都要创建索引的情况下,联合索引优于单值索引
  12. 限制索引的数量

哪些字段不建议作为索引?

  1. where 用不到的字段
  2. 数据量小的表最好不要使用索引
  3. 有大量重复数据的列
  4. 经常更新的表
  5. 不建议用无序的值作为索引
  6. 删除不再使用或者很少使用的索引
  7. 不要定义冗余或重复的索引

数据库调优

  • 索引失效,没有充分利用到索引。--- 索引建立
  • SQL 语句优化,避免全表扫描。 --- 索引优化
  • 合理控制索引的数据,不是索引越多越好,索引过多会导致插入、更新、删除变慢。 --- 索引优化
  • 关联查询太多 join --- SQL 优化
  • 服务器调优 --- 调整 my.cnf
  • 数据过多 --- 分库分表

索引失效

  1. 最佳左前缀法则 多列索引,过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
  2. 主键插入顺序 UUID 作为主键会导致在插入数据时,造成 页分裂记录位移
  3. 计算、函数、类型转换导致索引失效
  • LEFT(name,3) = 'abc'
  • stuno + 1 = 90001
  1. !=<> 索引失效 !=<> 过滤得到的数据太多,导致**回表**次数太多,还不如进行全表扫描。
  2. is null 可以使用索引,is not null 无法使用索引
  3. like 以通配符 % 开头索引失效。
  4. or 前后存在非索引的列,索引失效。