SQL优化可以从哪些方面入手
一、表的设计优化
表的设计优化,参照阿里开发手册,例如:
1、字段选择合适的类型(verchat, number)等,字符串,金额等根据业务决定
2、选择合适的长度,比如性别等可以用一个字符表示的,就不要设值很长的空间,或者使用verchar这些可变长度的字符了
二、索引优化
根据索引创建原则建立索引(可参考上一篇文章:索引建立原则以及失效场景):
1、针对数据量大,且查询比较频繁的表建立索引
2、使用经常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引
3、尽量选择区分度高的字段作为索引,尽量建立唯一索引,区分度越高,使用的索引越高效。
4、尽量使用联合索引(多个字段),减少单列索引,查询的时候,联合索引很多时候可以用到“覆盖索引”,节省存储空间,避免“回表查询”,提高查询效率
5、索引也不是越多越好,尽量控制索引的数量
6、如果要建立索引的列不能存储null值,请在创建表时,使用not null约束,可以增加查询效率
避免索引失效,索引失效的场景:
1、违反最左前缀原则
2、范围查询右边的列,不能使用索引
3、不要在索引列上进行运算操作,索引会失效
4、字符串不加单引号,造成索引失效
5、以%开头的like模糊查询,索引失效。
三、SQL语句优化
1、 select语句务必指明字段的名称(不能使用select *),select *大概率会触发回表查询
2、SQL语句要避免造成索引失效的写法
3、尽量使用union all 代替 union ;因为union会多一次过滤重复数据的操作,效率低
4、避免在where自居中对字段进行表达式的操作,例如substr,可能导致索引失效
5、Join优化,能用innerjoin的就不用left join、left join;因为内连接innerjoin会自动帮你选择哪个表比较小,就放外面,把大表放里面,减少消耗,如果使用left join等就会认为你确定好了,不会调整顺序
四、主从复制、读写分离
对于数据库的使用,为了避免写的操作所造成的性能影响,可以采用读写分离的架构。
读写分离解决的是,数据库的写入,影响了查询的效率
五、分库分表
超过500万的数据,可进行分库分表
比如我之前哪家公司,使用日期作为分区键,每天500-2000万数据,要是不分区,那根本查不动;所以数据量上来了,就要选择合适的方案进行分库分表