本文根据mysql的索引进行总结;
先来介绍下索引:
定义:高效获取数据的数据结构。索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录
目的:提高查找效率。简单理解为 排好序的快速查找数据结构。索引类型:一般是bTree索引(数据结构本文先不作解释)
影响到2部分功能:
- where (通常是where)
- order by 使用索引增加速度
- 所以在创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
劣势:
- 索引虽然能增加查询速度,但是也会使得update,insert,delete的速度变慢,性能会收到影响,因为在做增删改的同时,还要更新索引信息
- 索引也是一张表,保存主键和索引字段,需要占空间
1.索引类型
索引分为五类:普通索引;唯一索引;主键索引;组合索引;全文索引;
普通索引 NORMAL
- 无任何限制,用于加速查询
- 可设置索引长度
为何要设置索引长度?譬如建表时,Name 长度为 50,但是我们只设置10就足够了,因为一般情况下名字的长度不会超过 10,这样会加速索引查询速度,还会减少索引文件的大小,提高 INSERT 的更新速度。
唯一索引 UNIQUE
- 索引列的值必须唯一,但允许为null。
- 如果是组合索引,那么列值的组合必须唯一。
主键索引 PRIMARY KEY
- 特殊的唯一索引,一张表只能有一个主键,不允许null,一般在建表时同时创建主键索引。 组合索引
- 指在多个字段上创建的索引,索引类型可以是以上三种类型。
- 最左前缀原则:只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
举例:
我们在三个栏位上建立了索引(name,age,city)
-- 会用到 select * from table where name='aa'; select * from table where name='aa' and age=10; select * from table where name='aa' and city='bj'; -- 不会用到 select * from table where age=10 and city='bj'; select * from table where city='bj';
全文索引 FULLTEXT
- 用来找文本中的关键字,与以上索引均不相同,需要配合match against操作使用,而不是一般的where语句加like。
- 只有在char,varchar,text列可建立
空间索引 SPATIAL (暂时略)
2.索引失效
mysql什么时候走索引?
- 在使用 <,<=,=,>,>=,BETWEEN,IN(视情况而定),以及某些时候的LIKE才会使用索引。因为Like在以通配符%和_开头作查询时,MySQL不会使用索引。
- 聚集函数Min(),Max()中的字段
- order by 和 Group By中的字段
mysql什么时候不走索引?
- MySQL能估计出全表扫描比使用索引更快时,不使用索引;譬如当表字段太少的时候。
- like前使用通配符的时候
- 在索引列进行函数操作的
- 使用not in,or(不确定),<>,!=等
如何判断sql有没有走索引?
在sql语句前加上 explain 例如:
explain select * from test where a<10 and c <10;
通过查看type字段来判断是否有走索引