• MySQL索引


    MySQL索引

    一、MySQL索引介绍

    1.1索引是什么?

    相当于一本书中的目录。帮助我们快速找到需要内容的页码。
    
    索引可以帮我们快速找到所需要行的数据页码。起到优化查询的功能。
    

    1.2 MySQL索引类型

    Btree索引    重点!!!
    Rtree索引
    Hash索引
    Fulltext全文索引
    GIS地理位置索引
    

    二、BTree结构

    2.1、介绍

    二叉树 -----> 平衡二叉树 -----> 平衡树

    BTree种类

    B-tree
    B+Tree 在范围查询方面提供了更好的性能(> < >= <= like)
    B*Tree
    

    B-Tree查找结构:

    现在使用的B*Tree:

    三、聚簇索引

    3.1 、聚簇索引BTREE结构( InnoDB独有)区

    3.1.1 、簇

    区extent >簇>64个pages ====>1M

    3.1.2、作用:

    有了聚簇索引之后,将来插入的数据行,在同一个区内,都会按照Ip值的顺序,有序在磁盘存储数据。MysQL InnoDB 表聚族索引组织存储数据表。

    3.1.3、簇构建前提:

    1.建表时,指定了主键列,MySQL InnoDB会将主键作为聚簇索引列,比如ID not null primary key
    2.没有指定主键,自动选择唯一键(unique)的列,作为聚簇索引。
    3.以上都没有,生成|隐藏聚族索引。
                     
    作用:
    	有了聚簇索引之后,将来插入的数据行,在同一个区内,都会按照ID值的顺序,有序在磁盘存储数据。
    

    四、辅助索引

    4.1、说明

    ​ 使用普通列作为条件构建的索引。需要人为创建。

    4.2、作用

    ​ 优化非聚簇索引列之外的查询条件的优化。

    4.3、图解

    4.4、辅助索引的细分(1)单列索引

    (1) 单列索引

    (2)联合索引

    说明:使用多列组合一个索引。

    联合索引,注意最左原则。idx (a,b,c)

    ​ 1.查询条件中,必须要包含最左列,上面列子就是a列

    ​ 2.建立联合索引时,一定要选择重复值少的列,作为最左列。

    # 全部覆盖 都走abc索引
    例如:idx(a,b,c)
    select * from t1 where a=and b=andc=
    select * from tl where a inand b in and c in
    select * from tl where b=andc=and a=
    
    部分覆盖: 走部分索引
    select * from tl where a=and b=select * from tl where a=
    select * from tl where a= andc=
    select * from t1 where a= and b >< >=<= likeand c=
    select xxxfrom tl where aorder by b
    

    五、前缀索引

    前缀索引是针对于,我们所选择的索引列值长度过长,会导致索引树高度增高。
    所以可以选择大字段的前面部分字符作为索引生成条件。
    会导致索引应用时,需要读取更多的索引数据页
    MvSoL中建议索引树高度3-4层。
    

    六、B+tree索引树高度影响因素

    1.索引字段较长:前缀索引
    2.数据行过多:分区表,归档表(pt-archive),分布式架构(大企业)
    3.数据类型:选择合适的数据类型。
    

    七、索引的管理命令

    7.1、什么时候创建索引?

    并不是将所有列都建立索引。不是索引越多越好。按照业务语句的需求创建合适的索引。
    将索引建立在,经常 where group by order by join on ....的条件。为什么不能乱建索引?
    1.如果冗余索引过多,表的数据变化的时候,很有可能会导致索引频繁更新。会阻塞很多正常的业务更新的请求。
    2.索引过多,会导致优化器选择出现偏差。
    

    7.2、管理命令

    1.查询表的索引情况mysql> desc city;
    key: PRI聚簇索引
    MUL: 辅助索引
    UNI:唯一索引
    mysql> show index from city;
    
    2.建立索引
    分析业务语句:
    mysql> select * from city where name=' wuhan' ;
    mysql> alter table city add index idx_na (name) ;
    # 组合索引
    alter table city add index idx_na_c (name,xxx);	
    # 前缀索引
    alter table city add index idx_d(disstrict(5));	
    
    3.删除索引
    mysql> alter table city drop index idx_na;
    

    7.3、压力测试

    新建索引,再次执行以上的命令!就可以看到明显的速度改变了!!!

    ----------------------------------面试题级别的-------------------------------------------

    一、回表

    什么时候回表?
    辅助索引:将辅助索引列值+ID主键值,构建辅助索引B树结构。
    用户使用,辅助索引列作为条件查询时,首先扫描辅助索引的b树。
    1,如果辅助索引能够完全覆盖我们的查询结果时,就不需要回表了。
    2,如果不能完全覆盖到,只能通过得出的ID主键值,回到聚簇索引(回表)扫描,最终得到想要的结果。
    
    回表会带来什么影响?
    1. I0量级变大
    2. IOPS会增大
    3.随机I0会增大
    
    怎么减少回表
    1.将查询尽可能用ID主键查询
    2.设计合理的联合索引
    完全覆盖
    select name, age,gender from t1 where name='zs'
    3.更精确的查询条件+联合索引
    select★from tl where name='zs' and addr ='bj'
    

    二、更新数据时,会对索引有影响吗?数据的变化会使索引实时影响吗?

    比如insert, update, delete 数据。
    对于聚簇索引会立即更新。
    对于辅助索引,不是实时更新的。
    在InnoDB内存结构中,加入了insert buffer (会话),现在版本叫change。
    Changebuffer功能是临时缓冲辅助索引需要的数据更新。
    当我们需要查询新insert的数据,会在内存中进行merge(合并)操作,此时辅助索引就是最新的。
    
  • 相关阅读:
    [Codevs 1230]元素查找(手写哈希表)
    bat+sqlcmd 批量执行脚本
    为Redmine的项目加上起止时间
    SDUT 1068-Number Steps(数学:直线)
    对象间的联动--观察者模式
    《千与千寻》给读者带来了什么?
    二叉树中和为某一值的路径
    关于Win8 用不了USB转串口驱动
    Android Socket编程学习笔记
    java中的正则操作总结
  • 原文地址:https://www.cnblogs.com/hsyw/p/14022400.html
Copyright © 2020-2023  润新知