索引
介绍

总之,加了索引可以加快查询时间。
主键默认创建索引。
分类
根据数据结构分类:Harsh索引、B+Tree索引
根据功能分类:单列索引(包括:普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引

Harsh索引就是索引字段根据一种计算方法f(x)得到相应的值,如a->f(a)->A,之后你想找a,还按照这个计算方法得到A就可以直接找到目标。没有索引之前,就是从表格的开头一个一个比对。

B+Tree索引就是把一堆数据分块,在哪个区间就在这个区间找。比如要找图中的006,从根003 005 开始,左边是小于003的,中间是大于等003并小于005的,右边是大于等于005的,所以我们直接到第二层的最右边找,再到第三层的最右边找。最后一层才有每个数据所在位置的索引。
单列索引
单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引;
普通索引
普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
创建索引:
1、创建表的时候直接创建
sql
create table 表名(
列名1 数据类型,
列名2 数据类型,
...,
-- 创建索引
index 索引名(要加索引的列名)
);
2、表外创建
sql
create index 索引名 on 表名(加索引的列名);
3、修改表结构添加索引
sql
alter table 表名 add index 索引名(要加索引的列名);
查看索引:
1、查看数据库中的所有索引。(前面的是固定的,查的时候复制改一下数据库名就好了)
sql
select * from mysgl.'innodb_index_stats' a where a.'database_name'='数据库名';
2、查看表中所有索引,方法1。
sql
select * from mysgl.'innodb_index_stats' a where a. 'database_name' = '数据
库名' and a.table_name like '%表名%';
3、查看表中所有索引.方法2。
sql
show index from 表名;
三种方法显示的效果不太一样。
删除索引:
方式1:
sql
index 索引名 on 表名;
方式2:
sql
alter table 表名 drop index 索引名;
唯一索引
唯一索引与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,列值的组合必须唯一。它有以下几种创建方式:
1、创建表的时候直接创建
sql
create table 表名(
列名1 数据类型,
列名2 数据类型,
...,
-- 创建索引
unique index 索引名(要加索引的列名)
);
2、表外创建
sql
create unique index 索引名 on 表名(加索引的列名);
3、修改表结构添加索引
sql
alter table 表名 add unique index 索引名(要加索引的列名);
删除方法和上面相同。
主键索引
每张表一般都会有自己的主键,当我们在创建表时,MySQL会自动在主键列上建立一个索引,这就是主键索引。主键是具有唯一性并且不允许为NULL,所以他是一种特殊的唯一索引。
组合索引
组合索引也叫复合索引,指的是我们在建立索引的时候使用多个字段,例如同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者是唯一索引。
复合索引的使用复合最左原则。

组合普通索引:
sql
create index 索引名 on 表名(列名l (length),列名2 (length));
组合唯一索引:
sql
create unique index 索引名 on 表名(列名l (length),列名2 (length));
全文索引
(不常用)
- 全文索引的关键字是fulltext
- 全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配。
- 用like+%就可以实现模糊匹配了,为什么还要全文索引?like+%在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比like+%快N倍,速度不是一个数量级,但是全文索引可能存在精度问题。





空间索引
- MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型
- 空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、 POLYGON.
- MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。
- 创建空间索引的列,必须将其声明为NOT NULL。
- 空间索引一般是用的比较少,了解即可。


索引优化
避免索引失效应用------全值匹配
创建组合索引:
sql
create index idx_n_s_a on tb_table(name,status,address);
此时在进行查找,如果把组合索引的每一列都给用上是效果最好的。
如果全都用上,不需要考虑它们的顺序。
如果不全用,要按从左到右的顺序用上,不然索引会失效。(复合最左原则)
1、索引要从最左边开始匹配,范围查询右边的列,不能使用索引
例如:select * from tb_table where name = 'lining' and status > '5' and address = '北京'; 此时最后的address索引就会失效,只有前面两个组合索引。
2、在索引列上进行运算操作, 索引会失效(status是char类型)
例如:select * from tb_table where substring (name,3,2)='科技' ; 此时索引失效。
3、字符串不加单引号,造成索引失效
例如:select * from tb_table where name = 'lining' and status > 4 ; 此时只有name索引有效。