大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

探索 MySQL 索引


什么是索引

索引是用来加速查询的一系列数据,通常都是放在一个文件表中,所以使用索引会增大存储空间。索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部数据后选择符合条件的,而有了相应的索引后,数据库会直接在索引中查找符合条件的选项。

索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

原理:把常用来查询的数据(如果有增删操作,不建议使用索引),建立索引,索引在一张表中,这张表是有序的,可以用二分法查找,表的数据储存的就是数据存放的位置,通过使用二分法来快速查找,定位到数据。

为什么使用索引

在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关。对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否selective会导致这些字段建立的索引对查询速度的提升幅度不同,而且索引页并非越多越好,因为写入或删除时需要更新索引信息)。

索引的类型

(1).唯一索引

(2).全文索引

(3).组合索引

(4).反向索引

(5).函数索引

注意:当查询第一个使用了不走索引的条件整个语句都不会走索引

MySQL使用索引的场景

(1).若where条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。

(2).如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。

(3).多表做join操作时会使用索引,(如果参与join的字段在这些表中均建立了索引的话)。

(4).若某字段已建立索引,求该字段的min()和max()时,MySQL会会使用索引。

普通索引

创建索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构(添加索引)

创建表的时候直接指定

删除索引的语法

唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

创建索引

修改表结构


创建表的时候直接指定


使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list):添加普通索引,索引值可出现多次。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引

你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:


使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:

你也可以使用 ALTER 命令删除主键:

删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

尝试以下实例:

MySQL使用索引的场景

(1).若where条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。

(2).如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。

(3).多表做join操作时会使用索引,(如果参与join的字段在这些表中均建立了索引的话)。

(4).若某字段已建立索引,求该字段的min()和max()时,MySQL会会使用索引。

使用索引的优点

(1).可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性。

(2).建立索引可以大大提高检索的数据,以及减少表的检索行数。

(3).在表连接的连接条件,可以加速表与表直接的相连。

(4).在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库的记录会重新排序)。

(5).建立索引,在查询中使用索引,可以提高性能。

使用索引的缺点

(1).在创建索引和维护索引会消耗时间,随着数据量的增加而增加

(2).索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间。

(3).当对表的数据进行INSERT,UPDATE,DELETE的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件,一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。

使用索引需要注意的地方

在建立索引的时候应该考虑索引应该建立在数据库表中的某些列上面哪一些索引需要建立,哪一些索引是多余的。一般来说: (1).在经常需要搜索的列上,可以加快索引的速度

(2).主键列上可以确保列的唯一性

(3).在表与表的而连接条件上加上索引,可以加快连接查询的速度

(4).在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit)

(5).在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)

(6).like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick '%ABC%' 那么这索引将不会起到作用.而nickname lick 'ABC%' 那么将可以用到索引

(7).索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串

(8).使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.

(9).不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描

(10).选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快

什么情况下不创建索引

(1).查询中很少使用到的列不应该创建索引,如果建立了索引反而还会降低mysql的性能和增大了空间需求.

(2).很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率

(3).定义为text和image和bit数据类型的列不应该增加索引

(4).当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系