1、索引的类型与分类
索引的类型:
Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。
- FULLTEXT
即为全文索引,之前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。mysql5.6以后,InnoDB就可以使用全文索引了。 - HASH
HASH索引可以一次定位, 哈希算法复杂度为O(1)。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。 - BTREE
BTREE索引就是一种将索引值按一定的算法,B+树将所有的数据都存放在叶子节点,算法复杂度为O(log n),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。 - RTREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找。
索引种类:
- 普通索引
仅加速查询 - 唯一索引
索引列的值必须唯一,但允许有空值 - 主键索引
索引列的值必须唯一,不允许有空值,但是表中只有一个 - 组合索引
多列值组成一个索引,专门用于组合搜索,其效率大于索引合并 - 全文索引
对文本的内容进行分词,进行搜索,简单来说就是在一大段文字中通过关键词就可以找出该记录所属的行记录,比如说:“张三是世界上最帅最聪明的人”,然后通过“最帅最聪明”就可以找到该行的记录。
2、索引的创建
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
ALTER TABLE:
ALTER TABLE用来创建普通索引、UNIQUE索引、PRIMARY KEY索引或全文索引。
- 普通索引
alter table tb_name add index index_name(column_list);
添加普通索引, 索引值可以出现多次。 - 唯一索引
alter table tb_name add unique index_name(column_list);
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次) - 主键索引
alter table tb_name add primary key(column_list);
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL - 全文索引
alter table tb_name add fulltext index_name(column_list);
该语句指定了索引为FULLTEXT, 用于全文索引。
CREATE INDEX:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name(column_list);
如果不选择参数,那么默认就是普通索引,BTREE索引。
- 普通索引
CREATE INDEX index_name ON table(column(length)); - 唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length)); - 全文索引
CREATE FULLTEXT INDEX index_content ON article(content);
3、索引的查看
SHOW INDEX FROM <表名> [ FROM <数据库名>]
4、索引的删除
DROP INDEX <索引名> ON <表名>
5、索引失效的情况
1.如果条件中有or,只有一部分条件有or,索引也不会生效,如果想索引生效的话,可以将所有的条件都加上索引。
2.复合索引要符合最左原则。
3.like查询是以%开头。
4.需要类型转换的,比如列字段是字符串类型的,不加分号’ ',把他当作int类型,索引会失效,因为如果是字符串的字段建立索引,mysql会把字符串转成int再建立索引(注意:字符串’123’不一定会转成int123)所以索引会失效。
5.当全表扫描速度比索引速度快时,mysql底层优化,会使用全表扫描,此时索引失效。