跳到主要内容

数据库优化

基本

平衡范式,适当冗余

避免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做主键

合理使用索引

  1. 依据查询决定索引
  2. 控制单表索引数量
  3. 左前缀匹配原则
  4. 最频繁查询建立覆盖索引
  5. Join 字段上建立索引

索引失效的场景

开发规范

  1. 隔离线上、线下环境
  2. 统一命名规范
  3. 避免使用关键字
  4. 统一字符集、字符序
  5. 禁止未审核SQL 上线

参考文档

  • 阿里云开发者社区-藏经阁-MySQL表和索引优化实战