在面试的时候,极有可能会问到SQL优化相关的问题,下面模拟一下面试场景。
面试官:你们平时是怎么来优化SQL的?
答:关于SQL的优化,我主要从以下4个方面考虑。
1、表结构优化
表结构的优化包括给字段设计合适的类型、尽可能使用varchar代替char、取消无效索引。
给字段设计合适的数据类型:也就是尽量使用数字型字段。比如某个字段只含数字信息,那么就不要将该字段设置为字符类型,因为这样会降低查询和连接的性能,也会增加存储开销。因为存储引擎在进行查询和连接时会逐个比较字符串中的每一个字符,而对于数字型而言,就只需要比较一次。
尽可能使用varchar代替char:这是因为变长字段存储空间小(随字段的值变化),可以节省存储空间。
取消无效索引:当索引列有大量重复数据的时候,可以把该索引删掉。比如有一列是性别,几乎只有男、女这两个值,这样的索引就是无效的。
2、查询优化
1)尽量避免在where子句中使用!=或<>操作符
2)尽量避免在where子句中使用or来连接条件,因为如果两个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描。
3)应尽量杜绝使用select * 语句
4)避免在where子句中对字段进行null值判断
冷知识:关于使用or查询会导致索引失效,所谓的索引失效指的是:假如or连接的两个查询条件字段中有一个没有索引的话,引擎会放弃索引而走全表扫描。但是MySQL5.0版本之后引入了index_merge索引合并。也就是说,我们现在可以利用上多个索引去优化or查询了。
3、索引优化
1)应对作为查询条件和order by的字段建立索引
2)避免建立过多的索引,多使用组合索引
4、慢查询优化
1)分析语句,是否加载了不必要的字段
2)分析SQL执行计划,是否命中索引
3)如果SQL很复杂,尽量优化SQL结构
4)如果表数据量太大,考虑分表