MySql
Myql调优
- 数据类型优化
- 数据类型优化
- 主健优化
- 三范式,反三范式
- 合理数据冗余
- 增加索引 (需要在补下课程)
- 索引优化
- 执行过程优化
- mysql集群(读写分离,分库分表,)
- 查询语句优化
- 在使用索引+模糊匹配时,使用 like %j 这种模式是不被允许的,百分号在前面的模糊查询没有用到索引
- sql查询少用 * 做匹配
- order by 是全排序,效率很低,索引默认做了排序
- 执行计划
- 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 越短越好
- 面试题 (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的速度一样 - 索引下推
- 创建索引的一些原则
- 创建组合索引考虑顺序问题
- 创建索引的时候注意索引所占用的一个内存空间
- 实操
- 在所数据迁移到mysql是,现将mysql的自动生产索引关闭(自动创建索引开着的情况下,迁移数据效率很低),数据迁移完成后 在打开,索引可以会被创建
- 优化小细节
- 当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而不是数据库层
- 尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询
- 使用 blom varchar等字符串格式的字段,在做索引的时候 尽量使用前缀索引
- 查询基数(列中不重复的数) select count(distinct city) form citydemo 基数越小越好
- 使用索引扫描来排序
- union all,in,or都能够使用索引,但是推荐使用in
- 范围列可以用到索引
- 强制类型转换会全表扫描
- 更新十分频繁,数据区分度不高的字段上不宜建立索引
- 创建索引的列,不允许为null,可能会得到不符合预期的结果
- 当需要进行表连接的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致
- 小表join大表
- 使用join的时候 最好使用两张表的索引做匹配
- 能使用limit的时候尽量使用limit
- 单表索引建议控制在5个以内
- 单索引字段数不允许超过5个(组合索引)
- 索引优化多在 程序运行上线后 发现sql执行满,在针对性的去做执行
- 查询优化
- 减少访问数据量的方式
- 查询时候少用 * 做结果集,在查询是最好使用别名
- 将外连接转成内连接,内连接效率大于外连接
- 能用一个表达式解决就不用多个表达式
NEXTMysql 分区表-分区操作