MySQL常用优化手段

范式

设计时数据库要遵循范式, 适当的反范式也可以

优化SQL语句

  • SELECT语句务必指明字段名称
  • 当只需要一条数据的时候,使用 LIMIT 1
  • 如果排序字段没有用到索引,尽量少排序
  • 如果限制条件中其他字段没有索引,尽量少用 OR
  • 合理使用IN和EXISTS。
    • 区分 IN 和 EXISTS 主要是造成了驱动顺序的改变(这是性能变化的关键),
    • 如果是 EXISTS,那么以外层表为驱动表,先被访问
    • 如果是 IN ,那么先执行子查询。所以 IN 适合于外表大而内表小的情况,EXISTS 适合于外表小而内表大的情况。
  • 避免在 WHERE 子句中对字段进行 NULL 值判断
    • 对于 NULL 的判断会导致引擎放弃使用索引而进行全表扫描。
  • 避免在 WHERE 子句中对字段进行表达式操作
  • 避免隐匿类型转换
  • 建立联合索引时,要遵守最左前缀
  • JOIN优化
    • 尽量使用 INNER JOIN,避免 LEFT JOIN
    • 参与联合查询的表至少为2张表,一般都存在大小之分。如果连接方式是INNER JOIN,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是LEFT JOIN在驱动表的选择上遵循的是左边驱动右边驱动的原则,即LEFT JOIN左边的表名为驱动表。
    • 合理利用索引, 被驱动表的索引字段作为 ON 的限制字段
    • 利用小表去驱动多大表, 这样可以减少嵌套循环中的循环次数,以减少IO总量及CPU运算的次数。

创建合理的索引

  • 考虑数据的区分度、唯一性、来合理建立索引

分表

  • 当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,就采用水平分表和垂直分表优化

读写分离

  • 当请求数量变大时,建立数据库集群,采用读写分离的方式分担压力

缓存

  • 利用Redis缓存热点数据

选择合适的存储引擎

  • 根据数据的不同(业务数据、日志)来选择合适的存储引擎,如Innodb、Myisam