表设计
使用小而简单的字段类型
字符型设置满足需要的最小字段,过长会浪费内存
作为关联条件的字段尽量设置为相同的数据类型
字段最好设置非null,因为这可能会导致=判断,函数等结果不符合预期
索引的创建尽量避免选择频繁修改的字段,那些在where,group by,order by中出现的字段应该优先考虑建立索引
不能建立过多索引,会影响数据增删改效率。建立索引时,应该尽量扩展已有索引而不是一来就新建索引
创建复合索引时,应该考虑字段的顺序,根据经验值把选择性高的字段放在前面,但是实际过程中我们还应该考虑到分组,排序的顺序,当顺序一致时可以用到索引排序,提高查询效率
sql优化
多表联查时,尽量把数据量小的表放在前面作为主表,外表的关联字段在数据量大时可建立索引
根据sql执行顺序,过滤条件应该尽量提前执行,where中的条件在适当时候可以放到on条件中,提前减少数据量
使用like时避免进行前缀模糊匹配,尽量以固定值开头才能使用索引
条件中要避免隐式类型转化,这会导致不能用到索引
等号左边避免进行表达式运算和函数运算,这会导致不能用到索引
避免使用or符号,可能会导致索引失效,可以用union all进行替代操作
避免在 where 子句中使用!=或<>操作符
避免在 where 子句中对字段进行 null 值判断
in 和 not in 也要慎用,可以用exists 代替in
当我们用exists 判断一条语句是否存在结果时,尽量加上limit 1,减少数据的检索量
超大分页可以使用索引覆盖先查询主键,再使用延迟关联通过主键检索数据,这样可大大提高查询效率
当使用order by时,字段顺序应尽量和索引顺序一致,利用索引排序
MySQL7中当使用group by时,如果不需要对数据排序,可使用order by null来禁止排序
避免使用select * ,尽量使用覆盖索引
在数据量超大时可考虑进行分区,根据经常查询的情况分两种,如果经常查询所有字段或大部分字段,则按行进行分区,如果经常只查询某几个字段,可按列分区