01、目标
掌握索引创建的语法和规则
02、概述
MYSQL索引是一种数据结构:b+tree + hash 进行实现和存储架构。
03、索引分类
- 普通索引:单纯的为了加快查询速度。
- 全文索引:针对text/longtext字段类型加索引。(es)
- 唯一索引:加快查询速度,且约束该列的值不能重复。
- 主键索引:和唯一功能类似,单是一张表中只能有一个主键索引,复合索引有多个。
作用:
普通的索引:就是未来建设的复合索引,或者组合索引,其实大部分的索引的优化都是建设普通索引
全文索引:一般开发不使用,因为全文索引达不到到中文的分词的具体效果。所以后续都使用es进行取代
唯一索引:给我表某列简历唯一约束,这样的好处可以防止脏数据(可以解决数据的幂等性)。比如订单号,email、openid、appid等都可以考虑使用唯一约束。
幂等性 == 不论你执行多少次,其结论都是一个。
主键索引:你只要在给表创建一个主键列,主键索引自动创建。不需要你额外的申明。如果没有主键列呢?就找一个唯一约束的列,如果都没有呢?就找一个默认rowid作为的索引列。*所以在使用innodb引擎的数据表的时候,一定要给表建立主键列
##04、索引相关的概念
-
=聚集索引(聚簇索引):也就是说Innodb引擎的表都有一个且唯一一个聚集索引(默认是主键)。如果没有主键列会选择唯一键的列,如果都没有,则隐式的rowid作为聚集索引。
表的文件:.frm .ibd ------>ibdata
-
非聚簇索引(二级索引):所有非聚集索引,都称为二级索引。myisam
-
单列索引:索引只涉及一个列
-
多列索引(复合索引、联合索引、组合索引):索引涉及多个列(最好<=16个)
-
覆盖索引:
这不是一种索引
。是指:在查询的时候,“查询语句所有的列,刚好都包含在查询条件的索引列中”。比如:user_index
05、覆盖索引
它并不是一种给某个列创建索引之类的操作。它是在查询的时候,“查询语句所有的列,刚好都包含在查询条件的索引列中。
SELECT nickname,age,male FROM kss_user
– id,email,name —查询语句所有的列
CREATE INDEX nickname_age_male_index ON kss_user(nickname,age,male);
- 覆盖索引和顺序是没有关系的
06、like走不走索引问题,为什么在开发中尽量不要写 *?
SELECT nickname,age,male FROM kss_user where nickname like '%1%'
like全模糊匹配可以在:覆盖索引的情况下是可以进行索引命中。
为什么在开发中不要去写*呢。就 是如果你刚好查询的列,是索引列的话,有可能就命中所谓的覆盖索引。
当然:我们开发过程中,千万不要为了去走这种所谓的覆盖索引,然后就给一个SQL语句的所有的列建立组合索引呢?
当然不是,讲覆盖索引的意义就是告诉你:如果可以走覆盖索引就一定要去想法去靠近。总比不比走要好。
举个列子:
SELECT count(id) FROM system_user;
在开发中求count建议大家多使用索引列进行求取总数,这样的可能命中到覆盖索引。默认情况下:无论你是count(1)还是count(*) 还是count(id)都走覆盖索引index。索引统计速度是非常快的。
07、总结
1、覆盖索引:它并不是一种给某个列创建索引之类的操作。它是在查询的时候,“查询语句所有的列,刚好都包含在查询条件的索引列中。
2:普通索引,全文索引,唯一索引,主键索引(创建表只要主键列自动就会建设)。
3:在开发过程中,如果能够使用索引列查询,尽量不要写*。在开发中少写*吧。