SQL索引

1y 根据拼音首字母查找 物理连续

2贝 根据偏旁查找 逻辑连续

索引

目的:提交数据的检索效率

主键默认为聚集索引

索引相当于是数据库表的一种特殊的目录。SQLServer提供了两种索引:聚集索引和非聚集索引。

 

注意:一张表只能有一个聚集索引,通常情况下是主键,并不是必须为主键。

聚集索引

表示物理上的连续性。

非聚集索引

表示逻辑上的连续性。

 

聚集索引和非聚集索引的应用场景SQL索引

 

比如:返回某一范围内的数据中的一项数据。比如:我们的一个表中有一个时间字段,恰好我们把聚合索引建立在了该字段上,这个时候我们查询2019年1月1日到2019年12月30日之间的全部数据时,这个速度将会是很快,因为我们的这个字典正文是通过日期来进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据就行;如果我们使用非聚集索引,那么还要查到2019年1月2号对应的页码,然后再根据页码来查询数据,那将是很耗时的。

 

关于索引的不正确理解

1主键就是聚集索引

通常来说,我们会在每个表中建立一个id字段,用来区分每一条数据,而且通常来说会使用id自增长配置,每次自增为1。聚集索引最大的好处就是建立查询数据的一个区间,降低查询数据的总条数,避免全表查询。在实际应用中,因为id是自动生成的,程序员并不知道每条记录所对应的id,所以我们很难在实际应用中进行一个id号作为查询条件。这也让id号作为聚集索引成为了一种资源浪费。其次,让每个id号都有不同的字段作为聚集索引页不符合“在大范围数量个不同的值作为非聚集索引”规则。所以说,这种错误操作是针对于用户经常修改记录内容,特别是索引项的时候还会起到负作用,但是对于查询速度并没有多大的影响。

一般来说,对于erp系统的首页都会显示每个用户为签收的文件或者会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的条件,但是如果您的系统已经建立了很长时间,并且数据量庞大,那么每个用户打开首页的时候都进行了一次全表扫描,这样做的意义不是很大,而且对于1月之前的文件信息,用户已经进行处理完成了。如果说还进行一个多余数据查询,只是增加了数据库的开销而已。所以说,我们完全可以让用户打开系统首页的时候,数据库仅仅查询了这个用户近3个月的未处理的文件就可以了。通过“时间日期”这个字段来限制表的扫描条数,提高查询速度。如果说我们所使用的办公自动化系统,已经存在了2年的时间,那么从理论上来讲,查询速度将是原来的8倍之上。

 

2.【只要建立索引就可以提高查询速度】

     NONO

3.【把所有需要提高查询速度的字段都加进聚集索引,用于提高查询效率】

     NONO

使用索引总结

关于索引的使用问题,如果使用不当,不仅不会提高检索效率,如果过多或不当的索引配置,会导致系统效率低下。因为用户在每张表汇总加入一个索引,那么数据库就要做更多的工作。过多的索引甚至会导致索引碎片效应。

 

SQL语句的优化问题:1核心减少扫描次数 、2不去破坏索引

1.select * from table1 where name like “%wangji%” and tid > 10000 10wangji

2.select * from table1 where tid > 10000 and name like “%wangji%” 10005

对于上面两条语句,分析感觉是有区别的。因为对于第一条,先查询出name为wangji的数据,然后再从这批数据查询出tid大于10000;而第二条,先查询出tid大于10000,然后再从这批数据查询出name为wangji的。

其实对于这种分析是错误的。因为对于数据库来说,判断sql语句的时候,会判断出where中查询的条件那个索引能够缩小表的扫描条数。也就是自动化判断优先级。

 

那么说对于sql的编写,哪些会造成全表搜索呢?(以下错误示范)

  1. 使用模糊查询like :name like “%际”

  2. 使用or查询:name = “wangji” or age > 22

  3. 使用非操作符、函数引起的不满足扫描参数的:如:NOT、!=、<、>、!<、!>、NOT EXISTS、 NOT IN、NOT LIKE等,另外还有函 group by having。例如:

Name like “%际”

Abs < 5000

 

优化的注意:

  1. 尽量避免IN的作用相当于OR‘’

  2. NOT也尽量避免

  3. Exists和in的执行效率一样,也尽量避免使用

  4. 使用函数charindex()和上面使用通配符%的模糊查询Like执行效率一样

  5. Union并不绝对比or执行效率高

  6. 需要查询多少字段内容就查询多少字段内容,避免使用*所有字段内容获取

  7. Count(*)执行效率不会比count(字段名)慢

  8. Order by按聚集索引字段排序效率是最高的

  9. Top是高效:TOP 子句用于规定要返回的记录的数目。 select top 10 percent * from record --加“top 10 percent”表示查询的是数据表中前10%的数据,若将10改为20,则查询的就是前20%的数据.

  10.  

SQL索引

上一篇:分布式系统:一致性模型


下一篇:PostgreSQL 数据库基础使用(持续更新)