mysql 索引
#
索引 加速查询速度 mysql的存储引擎的索引基于 b+树\hash做的 innodb b+树 聚集索引/聚簇索引 非聚簇索引 myisam b+树 非聚簇索引 memory hash b+树做了那些事儿?为什么基于b+树的索引会快? 一颗平衡树 在非叶子节点不存储数据相关的信息,只存放指针 : 让树的高度降低了,所有的数据的寻找的时间是固定的 在叶子节点会直接存储数据或者数据的指针 : 能够直接找到对应的数据 叶子节点的各个数据块之间使用双向链表来连接 : 能够更好的进行范围\排序相关的操作 要想缩短树的高度,我们能做的事情 1.就是让每一列的宽度尽量的小 聚簇索引和非聚簇索引 聚簇索引 一张表只能有一个 只在innodb存储引擎中存在 b+树 : 在叶子节点会直接存储数据 所有的数据存储的物理地址是根据索引顺序 : 排序快 非聚簇索引 每张表可以有多个 在myisam,innodb中都存在 b+树 : 在叶子节点会存储数据的指针 所有的数据存储的物理地址和索引顺序无关 如果创建多个非聚簇索引,那么insert delete数据都会非常慢,并且占用更多的硬盘和内存
在创建表的时候创建索引 CREATE TABLE ind1 ( id int primary key, name char(12), index ind_name(name) ); 在建表之后添加索引 CREATE TABLE ind2 ( id int primary key, email char(12) ); CREATE INDEX ind_email on ind2(email); alter table ind2 add index ind_email(email); 删除索引 DROP INDEX ind_email ON ind2;
覆盖索引(好事儿) 是你能够从辅助索引中直接拿到想要的数据,而不需要再经过IO从聚集索引中取值了 可以在配置中开启慢日志,把所有的sql语句执行的超过了你预期时间的都记录下来,方便我们查看具体慢的sql语句,来进行修改和优化 聚集索引 直接把数据存储在建立好了的索引中 非聚集索引(辅助索引) name,sex 只有索引字段存储在索引中,该字段所在行的其他数据存储在另外的地址,在辅助索引的叶子节点上有一个指针指向这行数据所在的地址 select name where name like 'eva'; select name,sex where name like 'eva'; age创建一个索引 select age where age > 60; # 覆盖索引 select age,name where age > 60; # 不是覆盖索引 age,name创建一个联合索引 select age,name where age > 60; # 覆盖索引
explain和覆盖索引 甚至和索引都没有任何关系
它只是在真正使用某一条sql语句之前先来看一看这条语句计划中是怎么执行的