ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 索引的优缺点 优点: 1. 大大加快数据的检索速度,这也是创建索引的最主要的原因 2. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 3. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 缺点: 1. 创建索引需要耗费一定的时间,但是问题不大,一般索引只要build一次 2. 索引需要占用物理空间,特别是聚集索引,需要较大的空间 3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度,这个是比较大的问题。 ## 索引的使用      需要在这些列上建立索引: 1)在经常需要搜索的列上,这是毋庸置疑的;  2)经常同时对多列进行查询,且每列都含有重复值可以建立组合索引,组合索引尽量要使常用查询形成索引覆盖(查询中包含的所需字段皆包含于一个索引中,我们只需要搜索索引页即可完成查询)。 同时,该组合索引的前导列一定要是使用最频繁的列。对于前导列的问题,在后面[sqlite](https://so.csdn.net/so/search?q=sqlite&spm=1001.2101.3001.7020)的索引使用介绍中还会做讨论。 3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度,连接条件要充分考虑带有索引的表。;  4)在经常需要对范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的,同样,在经常需要排序的列上最好也创建索引。 6)在经常放到where子句中的列上面创建索引,加快条件的判断速度。要注意的是where字句中对列的任何操作(如计算表达式,函数)都需要对表进行整表搜索,而没有使用该列的索引。所以查询时尽量把操作移到等号右边。 不应该创建索引: 1)很少在查询中使用的列 2)含有很少非重复数据值的列,比如只有0,1,这时候扫描整表通常会更有效 3)对于定义为TEXT,IMAGE的数据不应该创建索引。这些字段长度不固定,或许很长,或许为空。 当然,对于更新操作远大于查询操作时,不建立索引。也可以考虑在大规模的更新操作前drop索引,之后重新创建,不过这就需要把创建索引对资源的消耗考虑在内。总之,使用索引需要平衡投入与产出,找到一个产出最好的点。 ## 查询不生效 1、=等于和in(某几个值)是会保持索引字段有效。 2、><这样大于小于和between and(区间判断)虽然不会让该索引字段失效,但是会导致后续的其他索引字段失效。 3、算术运算(加减乘除)和!=不等于一样,都是严重让索引字段完全失效的,包括后续的其他索引字段也失效。