索引的作用:
索引分类:
主键索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)
主键:某一个属性组能唯一标识一条记录,创建主键自动添加索引.
主键索引(也叫聚簇/聚集索引)是特殊的唯一索引,该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问(不需要回表)。myisam不支持聚簇/聚集索引,它的索引和数据是分离的
特点:
唯一索引:
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)
要求:索引列的值必须唯一,但允许有空值
普通索引:
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
作用:快速定位特定数据
全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)
快速定位特定数据
注意:
联合索引
ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 );
添加(column1, column2, column3)的联合索引,相当于添加了(column1, column2, column3),(column1, column3),(column1,column2),如果不包含column1,则不会索引(最左前缀原则).
查看表中的索引:
SHOW INDEX FROM tbl_name
删除索引:
ALTER TABLE tbl_name DROP INDEX index_name;
最左匹配原则
Mysql创建复合索引的规则是首先会对复合索引最左边,也就是第一个字段的索引进行排序,在第一个字段排序的基础上,在对第二个字段进行排序,所以直接使用第二个字段是没有顺序的.
索引失效
1.以%开头的LIKE查询不能使用BTREE索引
2.联合索引不符合最左匹配原则
3.数据类型出现隐式转换时也不能使用索引,比如 where name=“01” ,数据库把01当成了数字1了.
4.由于对字段进行运算、函数操作导致无法用索引.
5.order by 字段混合使用DESC ASC 不会使用索引
6.Where条件过滤的关键字和Order by中所使用的不同 不会使用索引
7.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
8.用 or 分割开的条件或者in 嵌套的条件, 如果 or 前的条件中的列有索引, 而后面的列中没有索引, 那么涉及到的索引都不会被用到
索引准则
索引的数据结构:
hash类型的索引:查询单条快,范围查询慢
b tree类型的索引:b++树,层数越多,数据量指数级增长(mysql一般用它,InnoDB默认支持)
InnoDB 支持事务,支持行级锁定,支持 B-tree,Full-text 等索引,不支持 Hash索引
MyISAM 不支持事务,支持表级别锁定,支持 B-tree,Full-text 等索引, 不支持 Hash 索引
B+树和B树的差异:
B+树的优缺点:
InnoDB和MyISAM都使用B+树作为索引的数据结构,但是实现有区别
回表
无法在普通索引树上获取需要的全部信息,需要再次查询主键索引树.
比如user表中有,id,name,age.id作为主键,然后添加name的索引
select * from user where name=“xx”,我们需要整行信息,我们在查询普通索引name的时候,能查到name呢行的主键,我们还需要去查询主键索引,这个过程叫回表.总共有2次查询b+树的操作.
select id,name from user where name=“xx”,这样不需要回表.
我们也可以简历联合索引, (name,age),这样他在普通索引上就能获取到所需要的全部信息,不需要再去查询主键索引树,加快查询速度.
覆盖索引
只需要在一颗索引树上查询,无需回表,速度较非覆盖索引快.
为什么mysql用b+树作为索引而不用b树?
MySQL索引背后的数据结构及算法原理学习链接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
详细深入的索引总结:https://zhuanlan.zhihu.com/p/29118331
Mysql中key 、primary key 、unique key 与index区别:https://www.cnblogs.com/zjfjava/p/6922494.html
b树和b+树的构造:https://blog.ouyangsihai.cn/mian-shi-guan-wen-ni-b-shu-he-b-shu-jiu-ba-zhe-pian-wen-zhang-diu-gei-ta.html