1,慎用distinct关键字在上一节中我们有讲到可以使用distinct关键字来优化sql查询,但同时我们又讲到要慎用distinct关键字。如果我们查询的字段只有一个或者很少量的字段,那么就可以使用它。但如果我们的select中有大量的字段,那么该关键字会大大降低查询的效率,这是因为使用distinct关键字后,sql引擎会在结果集中对所有的结果根据distinct后的列排序过滤等大量的工作,如果查询结果中的列多了,那么排序的复杂性就会呈几何倍数的增加,查询效率自然就会明显的降低了。
我们来看下面的select语句,并查看执行所需的时间。
select id,gid,name,did,model,unit from table1
在小编的计算机中执行时间为36秒。
我们再在select中使用distinct关键字,sql语句如下:
select distinct id,gid,name,did,model,unit from table1
显然,这条sql会比上条sql查询出的结果要少,但在小编的计算机中却执行了2分钟。可见,distinct会多影响查询效率了。
2,慎用union关键字union的功能是将多个结果集合成一个结果集,它要求合并的多个结果集的列数与列的数据类型相同。同时它会在合并后过滤掉相同行的数据。正因为它会过滤掉相同行的数据,所在它在合并后会有一系列复杂的排序过滤等动作,所distinct关键字一行,多个字段的排序与对比是很耗时的。我们推荐使用union all来代替union,虽然union不过滤相同的行,但其实在大部分情况下,我们都是不需要过滤相同行的。
3,不要在in关键字中使用子查询如果in关键字中是常量,如 where name in ('a','b','c')这种没有关系。但尽量避免用where name
in (select name from table1)这样的查询条件。因为在in关键字中使用子查询后是无法使用索引的。
4,不要在like中用左包含%与全包含%如 where like '%xxx' 与 where like '%xxx%'。原因也是因为在like中用了左包含%与全包含%后无法使用索引,但右包含%没关系。
5,不要在where条件中使用函数同样原因,在where条件中使用函数会导致索引不可用。
下面给出所有会导致索引不可用的情况:
(1)对索引列使用了函数或计算
(2)对索引列使用了Like '%X' 或Like '%X%'
(3)在组合索引的第1列不是使用最多的列
(4)在Where子句中使用了In(子查询)
(5)数据类型转换将导致不能利用索引
(6)负向比较将导致不能利用索引00