一、为什么使用索引
使用索引就是为了提高数据的查询效率,类似于我们从小使用的字典。
在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。
二、索引分类
分类方式一:
1、聚集索引:聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。该索引中键值的逻辑顺序决定了表中相应行的物理顺序。通常是主键。
2、非聚集索引:叶级页指向表中的记录,记录的物理顺序与逻辑顺序没有必然的联系。非聚簇索引则更像书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。如普通索引,唯一索引,联合索引,全文索引。
分类方式二:
实现原理
1、HASH索引
哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。
2、BTREE索引
就是一种将索引值按一定的算法,存入一个树形的数据结构中。
3、RTREE索引
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找。
4、FULLTEXT
在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。
分类方式三:
1、普通索引
最基本的索引,它没有任何限制。
2、唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。
3、主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
4、全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。
5、组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
使用组合索引时遵循最左前缀集合.
例如创建了一个name, address的组合索引
select * from user where name = ‘xxx’ 此时,会走索引
select * from user where address = ‘xxx’ 则不会走索引
三、创建索引
1、CREATE TABLE时创建
CREATE TABLE table_name(id int primary key,name varchar(5) unique key);
或者
CREATE TABLE table_name(id int,name varchar(5), dd int,primary key (id),unique index (name),index (dd));
2、ALTER TABLE方式创建
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);
3、CREATE INDEX方式创建
CREATE INDEX index_name ON table_name (column_list);
CREATE UNIQUE INDEX index_name ON table_name (column_list);
注:不能用CREATE INDEX语句创建PRIMARY KEY索引。
如果需要选择索引类型,需要添加using btree或者using hash,否则按默认选择。例:CREATE INDEX index_name ON table_name (column_list) using hash;
四、查询索引
mysql> show index from tblname;
mysql> show keys from tblname;
注:InnoDB、MyISAM引擎默认创建索引类型为Btree索引,MEMORY引擎默认创建的索引类型为hash索引。
五、删除索引
DROP INDEX index_name ON talbe_name;
ALTER TABLE table_name DROP INDEX index_name;
ALTER TABLE table_name DROP PRIMARY KEY;
注:前两条等价




