面试被问到了sql优化,回来学习一下,看别人的文章,自己在手动记录一遍,算是加深印象吧。
所谓sql优化,本质上有三种选择:
1、降低目标sql语句的资源消耗
2、并行执行目标sql语句
3、平衡系统的资源消耗
以上的说明比较难理解,还是记录一些简单易懂的方法:
1、对查询进行优化,避免全表查询。
2、避免在where子句使用null值判断,会导致索引失效。
3、避免在where子句中使用!=和<>操作符,会导致索引失效。
4、避免在where子句中使用or连接条件,也会导致索引失效。
5、in和not in 也要慎用,也会导致索引失效。
6、避免在where子句中进行计算操作,例如select id from t where num = 100*2
7、避免在where子句中进行函数操作,例如select id from t where substring(name,1,3) = 'abc'
8、很多时候可以用exists代替in,例如:
select num from a where num in (select num from b)
可以优化为:
select num from a where exists (select 1 from b where num = a.num)
9、并不是所有的索引对查询都有效,sql是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sql查询可能不会去利用索引。
10、索引不是越多越好,索引固然可以提高相应的查询效率,但同时也降低了insert和update的效率,因为insert或update时有可能会重建索引,所以创建索引需要慎重。
11、尽量使用数字类型的字段,如果只包含有数字信息的字段尽量不要设计为字符型,这回降低查询和连接性能,还会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中的每一个字符,而对于数字型而言只需要比较一次就够了。
12、尽量使用varchar/nvarchar代替char/nchar,因为变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
13、不要使用select *去查询。
以上都比较简单易懂,算是记录下吧,祝自己早日找到合适的工作。