索引真的很重要 !!

一、索引是什么

索引用来快速地寻找那些具有特定值的记录,所有的MySQL索引都以B-树的形式保存。如果没有索引,执行查询的时候MySQL必须从第一个记录开始扫描整个表中的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录既可迅速得到目标记录所有在位置。如果表有1000个记录,通过索引查找记录至少比顺序扫描记录快100倍。

我用了一张20W数据量的表,自己左连接自己(为了增加数据量)。

使用索引,查询全部用了6S;不使用索引查询全部用了465S;

二、索引的优缺点

1.索引的优点
第一,   通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,   可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,   可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,   在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,   通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

2.索引的缺点

第一,   创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,   索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,   当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

3.创建索引的准则
第一,   在经常需要搜索的列上,可以加快搜索的速度;
第二,   在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
第三,   在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
第四,   在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
第五,   在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
第六,   在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

4.不应该创建索引的准则
第一,             对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,             对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,             对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,             当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

三、索引的类型

1.主键索引

创建主键时会有一个唯一性的主键索引

主键索引和唯一索引的区别

1)主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

2)主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

3)唯一性索引列允许空值,而主键列不允许为空值。

4)主键可以被其他表引用为外键,而唯一索引不能。

5)一个表最多只能创建一个主键,但可以创建多个唯一索引。

6)主键更适合那些不容易更改的唯一标识

2.普通索引

语法:create index index_name on table_name(column_name)

3.唯一索引

语法:create unique index index_name on table_name(column_name)

4.复合索引

语法:create index index_name on table_name(column_name1,column_name2,column_name3)

对于复合索引,必须从左到右,并且不可以断。

比如

复合索引有以下几个(abc) (ab) (ac) (bc) (a) (b) (c),哪个符合

  1.(a) (ab) (abc)可以

  2.(bc)(b) (c)都没有从最左边开始

  3.(ac)中间断了没有b

猜你喜欢

转载自blog.csdn.net/qq_39404258/article/details/106070546