技术交流群:958923746,有学习视频,文档等。
一、索引的定义
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
二、索引创建的规则:
1、索引应该经常建在Where子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。
2、对于两表连接的字段,应该建立索引。如果经常在某表的一个字段进行Order By 则也经过进行索引。
3、不应该在小表上建设索引。
4.应该创建在选择性高的字段上,选择性越高,那么索引的效率越好、价值越大,唯一索引的选择性最高
5.组合索引中字段的顺序,选择性越高的字段排在最前面
三、什么时候需要创建索引
1.对于那些在查询中很少使用或者参考的列不应该创建索引
2.对于那些只有很少数据值的列也不应该增加索引
3.对于那些定义为text, image和bit数据类型的列不应该增加索引
4.当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。
四、优点
1、索引主要进行提高数据的查询速度。
2.索引是占物理空间的,索引是在数据库中另外开辟一块空间,将数据存放到了空间中。在查询的时候直接从空间中获取,无需进行库表查询,查询效率明显提高。
五、缺点
1、当进行DML时,会更新索引。因此索引越多,则DML越慢,其需要维护索引。 因此在创建索引及DML需要权衡,并不是创建的索引越多越好。
2.索引在创建与动态维护上需要大量时间,如果一个表中有频繁更新的数据,那么索引空间中会进行数据动态维护,浪费了大量时间。
六、索引失效的情况:
① Not Null/Null 如果某列建立索引,当进行Select * from emp where depto is not null/is null。 则会是索引失效。
② 索引列上不要使用函数,SELECT Col FROM tbl WHERE substr(name ,1 ,3 ) = 'ABC'
或者SELECT Col FROM tbl WHERE name LIKE '%ABC%' 而SELECT Col FROM tbl WHERE name LIKE 'ABC%' 会使用索引。
③ 索引列上不能进行计算SELECT Col FROM tbl WHERE col / 10 > 10 则会使索引失效,应该改成
SELECT Col FROM tbl WHERE col > 10 * 10
④ 索引列上不要使用NOT ( != 、 <> )如:SELECT Col FROM tbl WHERE col ! = 10 应该 改成:SELECT Col FROM tbl WHERE col > 10 OR col < 10 。
七、索引的创建