索引

1.索引主要用来提升数据检索速度,在数据量很大的时候很有用.索引相当于图书馆的图书目录,你要找本书可以在图书目录上找到这本书在哪个书架第几本,
  这样明显比到书架去找书要快得多,索引就是这个道理.索引在数据库优化当中起着非常重要的作用
2.索引简介

    索引是表示数据的另一种方式,它提供的数据顺序不同于数据在磁盘上的物理存储顺序。索引的特殊作用是在表内重新排列记录的物理位置。
    索引可建立在数据表的一列上,或建立在表的几列的组合上。

    回想一下图书馆中,存放着一架一架的图书。假设要找一本书,图书管理员视必要一架一架的寻找,直到找到想要的那本书为止。这样的查找肯定费时费力,
    那么管理员可以将所有的图书标题按字母分类建立索引卡片,按字母顺序放在不同的办公抽屉中,这样一架一架查找图书的过程就变成了在办公桌前抽屉中查
    询索引卡片了,很容易得到有关这本书的信息。

    再进一步设想,图书管理员很勤快,他不仅按照图书标题字母分类,而且还按作者姓名和出版社分别建立了另外的索引卡片,这个过程将给借阅者在检索图书
    信息时以更大的灵活性。因此在一个数据表中是可以建立多个索引的。

    在数据库中,对无索引的表进行查询一般称为全表扫描。全表扫描是数据库服务器用来搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止。
    这个操作可以比作在图书馆中查书,从第一个书架的第一本书开始,浏览每一本书,直到发现所要的书为止。为了进行高效查询,可以在数据表上针对某一字
    段建立索引,由于该索引包括了一个指向数据的指针,数据库服务器则只沿着索引排列的顺序对仅有一列数据的索引进行读取(只建立一个索引)直至索引指
    针指向相应的记录上为止。由于索引只是按照一个字段进行查找,而没有对整表进行遍历,因此一般说来索引查找比全表扫描的速度快。

    那么,是不是使用索引查询一定比全表扫描的速度快呢?答案是否定的。如果查询小型数据表(记录很少)或是查询大型数据表(记录很多)的绝大部分数据,
    全表扫描更为实用。例如,查询“性别”字段,其值只能是“男或女”,在其上建立索引的意义就不大,甚至不允许在布尔型、大二进制型(备注型、图像型等)
    上建立索引。
    
3.索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记
 录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到
 目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。

    索引的类型 :
    MySQL提供多种索引类型供选择:
    
    普通索引 :
    这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
    创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
    修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
    
    唯一性索引 :
    这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建:
    创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
    修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表)
    );
    主键
    主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。
    
    全文索引
    MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。
    它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,要了解更多信息,请参见MySQL documentation。
    
    单列索引与多列索引
    索引可以是单列索引,也可以是多列索引。下面我们通过具体的例子来说明这两种索引的区别。假设有这样一个people表:
    CREATE TABLE people ( peopleid SMALLINT NOT NULL AUTO_INCREMENT, firstname CHAR(50)
    NOT NULL, lastname CHAR(50) NOT NULL, age SMALLINT NOT NULL, townid SMALLINT NOT
    NULL, PRIMARY KEY (peopleid) );
    

原文地址:https://www.cnblogs.com/ghc666/p/8609706.html