Mysql

MySql

Myql调优

  1. 数据类型优化
    • 数据类型优化
    • 主健优化
    • 三范式,反三范式
    • 合理数据冗余
  2. 增加索引 (需要在补下课程)
  3. 索引优化
  4. 执行过程优化
  5. mysql集群(读写分离,分库分表,)
  6. 查询语句优化
    • 在使用索引+模糊匹配时,使用 like %j 这种模式是不被允许的,百分号在前面的模糊查询没有用到索引
    • sql查询少用 * 做匹配
    • order by 是全排序,效率很低,索引默认做了排序
  7. 执行计划
    • type
    • 显示的是访问类型 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
    • 做到 最少 range类型,尽量达到const - key_len
    • key_len 越短越好
  8. 面试题 (id 是唯一主键,自带索引,name是普通索引)
    • 回表(回表必须要在有普通索引的前提下才有)
    • 查询的数据的列 超过索引对应的列 会在查找索引B+tree后 在去server B+tree 查询数据 并返回
    • 比如 select * from name = 1
    • select age ,name ,id form = 1 - 索引覆盖
    • 查询的数据小于等于 索引的列 则查索引就好了,就够满足需要返回的值
    • 比如 select id from name = 1
    • 比如 select id,name from name = 1 - 最左匹配原则(最左匹配原则必须要在有组合索引的前提下才有)
    • 做精确查询的时候,where 尾随的如果是索引,则会用到索引查询,如果是普通数据,那用不到索引
    • 比如 select * from where name = ? and age = ? (name是普通索引,查询时候会用到索引)
    • select * from where age = ? and name = ?(查询的数据数中含有索引字段,在sql查询做优化时,会先匹配name,查询时候会用到索引) - 组合索引
    • select * from where name = ? and age = ?
    • select * from where name = ?
    • select * from where age = ?
    • 这个时候最优的索引 是 age+name组合索引 age索引
    • 为什么单个索引不用name索引,是因为 存age的容量比存name的容量小
    • age+name索引 查name和age 的速度和查 name+age的速度一样 - 索引下推
  9. 创建索引的一些原则
    • 创建组合索引考虑顺序问题
    • 创建索引的时候注意索引所占用的一个内存空间
  10. 实操
    • 在所数据迁移到mysql是,现将mysql的自动生产索引关闭(自动创建索引开着的情况下,迁移数据效率很低),数据迁移完成后 在打开,索引可以会被创建
  11. 优化小细节
    • 当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而不是数据库层
    • 尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询
    • 使用 blom varchar等字符串格式的字段,在做索引的时候 尽量使用前缀索引
    • 查询基数(列中不重复的数) select count(distinct city) form citydemo 基数越小越好
    • 使用索引扫描来排序
    • union all,in,or都能够使用索引,但是推荐使用in
    • 范围列可以用到索引
    • 强制类型转换会全表扫描
    • 更新十分频繁,数据区分度不高的字段上不宜建立索引
    • 创建索引的列,不允许为null,可能会得到不符合预期的结果
    • 当需要进行表连接的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致
    • 小表join大表
    • 使用join的时候 最好使用两张表的索引做匹配
    • 能使用limit的时候尽量使用limit
    • 单表索引建议控制在5个以内
    • 单索引字段数不允许超过5个(组合索引)
    • 索引优化多在 程序运行上线后 发现sql执行满,在针对性的去做执行
  12. 查询优化
    • 减少访问数据量的方式
    • 查询时候少用 * 做结果集,在查询是最好使用别名
    • 将外连接转成内连接,内连接效率大于外连接
    • 能用一个表达式解决就不用多个表达式