数据库优化
基本
平衡范式,适当冗余
避免3个以上的表join
控制单表数据量
1000万行,5GB以内,用于优化访问速度和DDL时间。
不要在数据库做运算
例如order by rand(), md5(),节省CPU 资源,避免打满
控制单表字段数量
控制在50个以内,避免宽表导致行迁移
一次查询,多次复用
多个相同查询并发执行,通过Redis缓存结果复用,避免因IO导致性能下降。
字段优化
合适的数据类型
选择合适的数据类型tinyint ~ bigint unsigned,以节省存储空间,避免行迁移。
避免Null
字段设置默认值,避免异常
int(11) not null default 0
大字段拆分到单独的表
SQL语句优化
查询要分页
避免一次性查询所有数据,避免大量数据加载到内存导致OOM,同时也会影响性能。
字段类型要一致
避免隐式转换
索引优化
索引原理
为什么树的高度代表的是IO的次数?
为什么多个单列索引的性能没有联合索引的性能高?
优化方向
避免索引计算
不要在索引字段进行计算,避免索引失效和调用大量的函数。
采用无符号整型自增类型主键
避免无主键和采用uuid做主键
合理使用索引
- 依据查询决定索引
- 控制单表索引数量
- 左前缀匹配原则
- 最频繁查询建立覆盖索引
- Join 字段上建立索引
索引失效的场景
开发规范
- 隔离线上、线下环境
- 统一命名规范
- 避免使用关键字
- 统一字符集、字符序
- 禁止未审核SQL 上线
参考文档
- 阿里云开发者社区-藏经阁-MySQL表和索引优化实战