- 表设计
- 存储引擎:没有特殊情况,尽量选择InnoDB引擎。
- 数据类型:尽量选择短小的数据类型,执行速度会更快。
- 垂直切分:冷热数据分离,保证主表的访问速度。
- 字段冗余:适当冗余字段,减少表连接。
- 图片存储:不要在库中存储图片数据。
- 表字符集:选择utf8类型。
- 索引
- 索引数量:单表索引个数尽量控制在5个以内。
- 索引大小:复合索引的字段个数不要超过5个。
- 避免重复:复合索引可发挥作用的就不要再单独建索引,譬如建立了(a,b,c),相当于建立了(a),(a,b),(a,c),(b,c)。
- 避免失效:
- 字段值中的NULL值会导致索引失效。
- 模糊匹配百分号前置会导致索引失效,譬如LIKE “%aa”。
- 负向查询会导致索引失效,譬如<>、!= 、not in 、not exist。
- 内置函数或表达式会导致索引无效,譬如where score-10 > 60、where abs(x) > 10。
- 强制转换数据类型会导致索引无效,譬如where userid=34987576。
- 复合索引中的第一个字段没有出现在条件语句中,会导致索引无效。
- JOIN的字段类型不一样,会导致索引无效。
- 适合与否:
- 不建议在频繁更新的字段上创建索引。
- 对于数据值类型很少的字段不适合索引,譬如性别。
- 对于text、bit数据类型的字段不适合索引。
- SQL语句
- 减少检索量
- 避免使用select *,select count(*)。
- 避免设置limit的offset,减少检索量。
- 怎样连接好:
- 用INNER JOIN替换LEFT JOIN,因为INNER JOIN比LEFT JOIN效率高。
- 用UNION ALL替换UNION,因为UNION 会去重和排序,效率低。
- 避免临时表:
- 利用索引,如果不能使用索引,数据库会创建临时表用于排序。
- 垂直切分,将长字段,如TEXT、BLOG,拆分到单独的表存储。
- 避免去重,能不去重,就别用DISTINCT;能用UNION ALL,就别用UNION。
- 避免子查询:用JOIN替换子查询,因为连接比子查询更快。
- IN值不宜多:IN包含的值不宜过多,建议少于100个。
- 预编译好处:预编译可提高性能,而且可以防止SQL注入。
- OLAP
- 冗余数据:冗余数据可以让查询执行更快,虽然冗余数据可以由其他列获得或推断得出。
- 缓存表:利用缓存表存储查询结果,提升查询效率。
- 预计算:预先对一些大查询生成汇总表。
- 命名
- 表命名
- 大小写:库名、表名一律小写。
- 分隔符:用下划线分隔。
- 限长度:库表名最大长度不要超过32字符。
-
- 索引命名
- 普通索引:idx_字段名
- 复合索引:idx_字段名1_字段名2_字段名3
- 唯一索引:uqi_字段名