一、表结构层次的优化
- 适当地使用冗余数据,以减少关联查询。
比如说订单表,每次查询订单的时候都要去查询下单用户的username,每次都要关联user表,重复工作很多。
对策:可以把username冗余到订单表里,以减少关联查询用户名称。 - 大数据字段拆成小表,常用字段分离出小表。
比如说景区表,有个字段叫 scenic_details (景区详情),存储了富文本结构的信息,字符长度可达几千甚至上万。查询列表的时候,如果连这个字段一起查出来,效率将会非常地慢。
对策:查询列表的时候不要查这个字段,需要用到的时候再去查。
二、索引的优化
- 给经常要查询的字段添加索引,最好是重复不多的字段
比如说经常需要通过用户名称查询用户信息,此时可以给用户名称添加索引。
关联其他表的外键也可以添加索引。 - 使用EXPLAIN查看mysql的执行计划
三、sql语句的优化
- 避免使用过于复杂的join和子查询,写join语句时用小结果集驱动大结果集。
- 禁止使用 select * ,需要什么就查什么,减少不必要的查询。
- 调整 where 子句的顺序,把能过滤掉更多数据的条件放前面。
- 不要在索引上计算,会使索引不可用。
- 尽量把多条sql压缩到一句sql中。
- 使用表的别名,可以减少解析时间。
- 使用 union all 代替 union ,or
- 使用 varchar 代替 char
- where子句禁止使用 is null,is not null,如果非要判断,建议设置null为0
- 能用 between 就不要用 in
- like 模糊查询,不要使用前置 % ,比如 '%abc%' 会引发全文检索。
四、数据库整体层次的优化
- 使用数据库主从配置,读写分离
- 分库、分表