mysql 索引

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语句之前先来看一看这条语句计划中是怎么执行的