什么是索引

索引有什么作用

索引为什么会加快查询速度

索引的种类

索引的创建(索引的例子)

1. ALTER TABLE

ALTER TABLE用来创建普通索引、unique索引或者primary key索引。

ALTER TABLE table_name ADD INDEX index_name(column_list)
ALTER TABLE table_name ADD UNIQUE(column_list)
ALTER TABLE table_name ADD PRIMARY KEY(column_list)
  • table_name:是要增加索引的表名。
  • column_list:指出对哪些列进行索引,多列时各列之间用逗号分隔。
  • index_name:可选,缺省是,MySQL将根据第一个索引列赋一个名称。
  • ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

2. CREATE INDEX

CREATE INDEX可以创建普通索引和UNIQUE索引。

CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)

注: table_name 索引名不可选。

删除索引

可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name
ALTER TABLE table_name DROP PRIMARY KEY
  • 前两条语句是等价的,删除掉table_name中的索引index_name。
  • 第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。
  • 如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

查看索引

show index from tblname;
show keys from tblname;

查询结果各字段解释

Table表的名称
Non_unique如果索引不能包括重复词,则为0。如果可以,则为1
Key_name索引的名称
Seq_in_index索引中的列序列号,从1开始。
Column_name列名称。
Collation列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
Cardinality索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
Packed指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment暂无资料 ···

MySQL中的索引

MyISAM索引

MyISAM引擎使用B+Tree 作为索引结构,叶节点的data域存放的是数据记录的地址。

这里假设表中一共有三列,以Col1为主键则。

  • MyISAM的索引文件仅仅保存数据记录的地址。
  • MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引的key要求是唯一的。而辅助索引的key值可以是重复的。
    如果在Col2上建立一个辅助索引,则此索引的结构如下。

如图,此索引同样是一颗B+ 树,data域保存数据记录的地址,因此,MyISAM 中索引检索的算法为首先按照B+树搜素算法搜素索引,如果指定的Key存在,则取出其data域中的值,然后以data域中的值为地址,读取相应数据记录。

MyISAM的索引方式也叫做”非聚集“ 的,之所以这么称呼是为了与INNODB的聚集索引区分。

InnoDB索引实现

InnoDB的索引也是使用B+Tree作为索引结构,但是具体的实现方式与MyISAM截然不同。
区别:

  1. InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB 中,表数据文件本身就是按B+树组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
  1. InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。
    如图在Col3上的一个辅助索引:
01-21 17:49