联合索引(x+y),那么sql语句的where条件上大于小于范围的哪种写法效率高?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了联合索引(x+y),那么sql语句的where条件上大于小于范围的哪种写法效率高?相关的知识,希望对你有一定的参考价值。

sqlserver表中,对x,y字段建了联合索引(x+y),那么sql语句的where条件,是写 where x>10 and x<50 and y>10 and y<50效率高呢,还是写where x>10 and y>10 and x<50 and y<50效率高呢? 为什么?

1、首先复合索引中列的次序很重要,如果index on (x,y),一般来说x的选择性要比y的选择性高比较好,如果x的选择性足够高,只对单列x提条件时也可能会用上这个索引
2、你这2个条件对于目前的大型数据库没差别,数据库在做执行计划都会进行优化,当然代码还是尽量做到不依赖于数据库的优化
3、如果想优化这个条件,个人觉得应该写成 x between 11 and 49 and y between 11 and 49,如果复合索引中x在y前
参考技术A 这个问题比较细,看来你比较细心。
1 如果数据量没上去的话,个人感觉应该是差别不大;主要是 y>10 和 x<50这两个条件的位置互换问题;
2 where的多个条件书写顺序:应该尽可能地第一次就过滤掉大部分无用的数据,只返回最小范围的数据;
3 假如 y>10过滤的比较多,就把 y>10放在x<50的前面;
也就是说和实际数据分布有关系,两个命令都执行下,应该就更清楚了。
参考技术B 4个条件,就只是一个顺序的问题,我的理解是一样的,没有效率差异。

MySQL联合索引

  1. 在一次查询中,MySQL只能使用一个索引。
  2. 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序、分组等。
  3. 若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影响数据写入性能。因为更新数据的同时,也要同时更新索引。
  4. 最实际的好处当然是查询速度快,性能好。

 

使用联合索引应该注意:

  1. MySQL使用联合索引只能使用左侧的部分,例如INDEX(a,b,c),当条件为a或a,b或a,b,c时都可以使用索引,但是当条件为b,c时将不会使用索引。这好比一本先根据姓,再根据名进行排序的电话簿,当查找的时候有姓的条件,效率会比没有任何条件高;如果在姓的基础上还有名的条件,效率会更高;但若只有名的条件,电话簿将不起作用

 

  1.     离散度更高的索引应该放在联合索引的前面,因为离散度高索引的可选择性高。考虑一种极端的情况,数据表中有100条记录,若INDEX(a,b)中a只有两种情况,而b有100种情况。这样对于查询唯一记录a = …,b = …时,先遍历全部索引看满足a条件的有50个索引节点,接下来还要再一个个遍历这50个索引节点。如果是INDEX(b,a),先遍历全部索引发现满足b条件的索引节点只有一个,再遍历这个节点发现也满足a条件。虽然最后都能找到那个唯一的索引节点,但是第二种索引顺序对引擎遍历索引效率有很大的提高(用电话薄的思想去思考问题)
  2. 查看列的离散程度:select count(distinct customer_id),count(distinct staff_id) from payment;

技术分享

customer_id列的离散程度更高,建联合索引时应该INDEX(customer_id,staff_id);

以上是关于联合索引(x+y),那么sql语句的where条件上大于小于范围的哪种写法效率高?的主要内容,如果未能解决你的问题,请参考以下文章

es7.x—查询篇

MySQL联合索引

SQL语句中where条件的写法

sql语句中where后边的哪些条件会使索引失效 -- SQL语句优化

SQL 语句调优 where 条件 数据类型 临时表 索引

sqlwhere后可以有多个条件后再嵌套吗