MySQL:最佳实践
目录
本文总结一些MySQL的最佳实践案例
纸上谈兵
- 范式:
- 第一范式:当关系模式R的所有属性都不能再分解为更基本的数据单位时,称R是满足第一范式,即属性不可分
- 第二范式:关系模式R满足第一范式,并且R的所有非主属性都完全函数依赖于R的每一个候选码,称R满足第二范式(不存在部分函数依赖)
- 第三范式:关系模式R满足第一范式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选码,称R满足第三范式,即非主属性不传递依赖于候选码。
- BCNF范式:关系模式R满足第一范式。若R中的所有非平凡函数依赖X→Y(Y不包含于X)的左部都包含R的任一候选键,则R∈BCNF。换言之,BCNF中的所有依赖的左部都必须包含候选码。(任何属性不能依赖于非候选码)
建库建表
- 默认使用InnoDB、mb4utf8字符集
- 不使用触发器等拖累MySQL计算资源的特性
- 可以交给具体业务维护
查询
- 不负向查询:not
- 不模糊查询:like
- 不允许where子句使用函数、表达式处理查询到的字段值,非要使用则必须慎重
- 可以对常量使用
- 不select *
- 多分片并带分片键进行查询
- 不用大表join
- 合理使用索引、注意联合索引的传入顺序
- 不要给经常更新的字段添加索引
- 拆表,减少单个超大表
- 在够用的前提下,使用更小的数据类型
- 避免NULL,尽量加上默认值,NULL对索引和查询优化的表现都很差
- 仔细检查类型不一致问题
- 数据库负载很重的情况下,不在SQL中做业务,简单查询后,返回给业务层,由业务代码进行数据处理
优化
- 索引:
- 原则:最适合索引的列是出现在WHERE子句中的列,或连接子句中指定的列,而不是出现在SELECT关键字后的选择列表中的列。
- 说在前面:
- 设计:对于数据库,在设计之初就应该进行优化方面的估计和考虑,尽量避免糟糕的库、表设计。
- 优化:优化没有放诸四海皆准的条陈,可以从一定程度上思考MySQL的执行方式,再结合数据特点、查询特点进行优化。
- 优化思路:使用EXPLAIN、SHOW WARNINGS等工具,查看执行计划,分析MySQL引擎做的工作,并如何避免一些低效事情的发生
- 垂直拆分的一些思路:
- 把不常用的一些列单独放到附表
- 经常组合查询的列放到一起
- 把text、blob等大字段拆分出来放到单独的表中
- 水平拆分
- 其他方案:
- 对于超大量的数据,可能MySQL并没有办法提供好方案,这个时候可以看看NoSQL等其他数据存储方案