(一)什么是索引?

百度百科:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

是一种排好序的数据结构,索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

(二)MySQL索引类型

Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。

  1. FULLTEXT
    即为全文索引,5,6版本前只有MyISAM引擎支持,5.6版本之后InnoDB存储引擎开始支持全文索引,其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,在 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
  1. HASH
    具有唯一特性,采用键值对的形式存储,HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,只在“=”和“in”条件下高效,对于范围查询、排序及组合索引效率不高。
  1. BTREE
    BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型
  2. RTREE
    1. 在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、 NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找

(三)索引种类

  1. 主键索引
    1. 主键的唯一索引,一个表只能有一个,不允许有空值。一般是在建表的时候同时创建主键索引,使用关键字PRIMARY 
  2. 唯一索引
    1. 索引列的值必须唯一,如果是组合索引,则列值的组合必须唯一,使用关键字UNIQUE
  3. 普通索引
    1. 普通索引(由关键字KEYINDEX定义的索引),可以加快对数据的访问速度。经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
  4. 全文索引
    1. 在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录,这种检索往往以LIKE %word%的形式出现,全文索引主要为了解决 LIKE “%xxx%” 这类针对文本的模糊查询效率较低的问题。
  5. 组合索引
    1. 指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。
  6. 外键索引
    1. 如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

索引应用

什么样的字段适合创建索引:

      在经常需要搜索的列上,可以加快搜索的速度; 

       在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 

       在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 

       在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 

       在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 

       在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

什么样的字段不合适创建索引:

对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 


对于数据单调,重复性高的字段不应该创建索引,比如性别 ,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大,增加索引,并不能明显加快检索速度。 


对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 

优缺点

优点
1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

3.加速表和表之间的连接;

4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点
1.索引需要占物理空间。

2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。