mysql--索引分类

索引的分类(存储结构):

        ①BTree索引(MySQL使用B+Tree):

B-Tree索引结构


B+Tree索引结构

        B+Tree是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

        ②hash索引:

        在memory表(内存表)中,默认使用的是hash索引。

        1.hash索引只包含哈希值和行指针,而不存储字段值 2. hash索引无法用于排序 3. 只支持等值比较查询 4 查询速度很快,但是某些情况下维护代价很高。


索引的分类(应用层次):

    ①单列索引: (主键索引,普通索引,唯一索引 )

        主键索引:就是特殊一点的唯一索引,关键字 PRIMARY

                  alter table 表名 add PRIMARY KEY (索引针对的列)     

        普通索引:由关键字 KEY 或 INDEX 定义的索引,其唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column = )或排序条件(ORDER BY column)中的数据列创建索引。

                  create  index 索引名称 on 表名(列名)

        普通索引常见误区:例如我们要查询第3个栏目,100元以上的商品  where cat_id=3 and price>100 ;  错误的做法是在cat_id上和price上都加上索引.实际上这只能用上cat_id或Price索引,因为都是独立的索引,同时只能用上1个

        唯一索引:和普通索引基本类似,不过唯一索引所在的列可以为null值。唯一索引所在的列不能为空字符串

                  create unique index 索引名称 on 表名(列名)

    ②组合索引:

        关键字是MultiIdx。在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。例如索引是key index (a,b,c). 可以支持| a,b a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

                  ALTER TABLE 表名  ADD INDEX 索引名称  (列名1,列名2);

        例如:某个表有一个联合索引(c1,c2,c3,c4)

            1    where c1=x and c2=x and c4>x and c3=x               

        等价于 c1=x and c2=x and c3=x and c4>x

            2    where c1=x and c2=x and c4=x order by c3            

        c1 ,c2索引用上了,在c2用到索引的基础上,c3是排好序的,因此不用额外排序.而c4没发挥作用.

            3    where c1=x and c4= x group by c3,c2

        只用到c1索引,因为group by c3,c2的顺序无法利用c2,c3索引

            4    where c1=x and c5=x order by c2,c3

        c1确定的基础上,c2是有序的,C2之下C3是有序的,因此c2,c3发挥了排序的作用.

    ③全文索引:

        索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建

                  ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名 ( 列名);

        SELECT * FROM 表名 WHERE 列名 LIKE '%查询字符串%'                                             (效率低)

        SELECT * FROM 表名 WHERE MATCH (列名1, 列名2)AGAINST('查询字符串')              (效率高) 


索引的分类(数据存储方式):

    ①聚簇索引:

            Innodb中,主键的索引结构中,既存储了主键值,又存储了行数据,这种结构称为”聚簇索引”

                1主键索引 既存储索引值,又在叶子中存储行的数据

                2如果没有主键, 则会Unique key做主键

                3如果没有Unique,则系统生成一个内部的rowid做主键

            优势:根据主键查询条目比较少时,不用回行(数据就在主键节点下)

            劣势:节点下存储了行数据,分裂的时候还要移动行数据。如果碰到不规则数据插入时,造成频繁的页分裂.

    ② 非聚簇索引: 

            myisam中, 主索引和次索引,都指向物理行(磁盘位置)。因此大数据量查询速度相对较快

            想对比于Innodb来说,myisam节点存储的物理行地址,内容较小又缓存在内存里,分裂速度要快很多


你可能感兴趣的:(mysql--索引分类)