什么是索引
索引有什么作用
索引为什么会加快查询速度
索引的种类
索引的创建(索引的例子)
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截然不同。
区别:
- InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB 中,表数据文件本身就是按B+树组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
- InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。
如图在Col3上的一个辅助索引: