1.存储引擎
查询插入操作多的表,用MyISAM。临时数据用Memeroy。常规并发大更新多用InnoDB。
2.分表或者分区
交易流水(历史)表类似的表:在年底为下一个年度建立12个分区,每个月一个分区。
渠道交易表:可以分成:当日表,当月表,历史表,历史表再分表。
3.字段定义
原则上选用可以正确存储数据的最小数据类型。为每一列选用合适的字段类型。
4.整数类型
INT 有六种类型,不同的类型的最大存储范围不一样,占用的存储空间不一样。
举例:性别字段用 Tinyint,因为enum也是整数存储。
5.字符类型
变长情况下用varchar ,定长用char。
比如邮政编码用char。
6.非空
非空字段尽量定义成not null,提供默认值,或者使用特殊,空串代替null。null类型的存储,优化,使用都存在问题。
7.不要使用外键,触发器,视图
降低可读性,影响性能,应该把计算的事情交给程序,数据库专心做存储;数据的完整性,应在程序中检查。
8.大文件存储
存文件服务器或者直接存磁盘上,数据库值存url(相对路径地址),不要使用text类型来存储。
9.表拆分或者字段冗余
表拆分:将不常用的字段拆分出去,减少列数和数据量。
字段冗余:各种名称都是可以冗余的,避免关联查询。
10.其他注意点
1.创建合适的索引。
2.改写sql,需要一些积累,例如:
1)关联查询使用小表驱动大表
2)用关联替代子查询
3)not exists转换为left join is null
4)or改成union
5)结果集允许重复的话,用union all 代替union
6)大偏移量的limit,先过滤再排序。
如果sql 本身解决不了, 就要上升到数据模型和架构了。
3.表结构(冗余,拆分,not null 等等),数据模型优化,架构优化(缓存读写分离分表等)。
4.业务层面优化(也就是数据模型优化),必须条件是否必要。
掌握正确的调优思路,才是解决数据库性能问题的根本。
(PS:数据量和计算量决定一切,优化的本质是减少数据量和计算量,和更合适的数据结构)