zoukankan      html  css  js  c++  java
  • mysql_4_1 索引

    mysql_4_1 索引

    标签(空格分隔): mysql

    原博客: https://www.jianshu.com/p/e872bc12f583
    原视频: https://www.bilibili.com/video/BV157411K7sf


    作用

    相当于书的目录,快速定位到内容。
    帮组我们快速找到所需要的行的数据页码,起到优化查询的功能。
    

    mysql 索引类型

    BTree 索引
    RTree 索引
    Hash 索引
    FULLText 全文索引
    GIS 地理 位置索引
    

    B+TREE 结构

    效率对比

    遍历 ——》 二叉树 --》 平衡二叉树 --》 Blance Tree 
    

    查找算法

    BTREE种类

    B-Tree ----> B+TREE ----> B*tree
    

    MYSQL如何构建b树的

    聚簇索引 BTREE结构
    区 extent ---》 簇    ====> 64个pages ----> 1M
    作用:
    有了聚簇索引之后,将来插入的数据行,在同一个区内,都会按照id值的顺序,有序存放在磁盘存储数据。
    MYSQL Innodb表 聚簇索引组织存储数据表。
    

    构建前提:

    1.建表时,指定了主键列,mysql innodb 会将主键作为聚簇索引列, 比如 id not null primary key
    2.没有指定主键,自动选择唯一键的列。
    3.以上都没有 ,也会生成隐藏的row_id
    画图说明,聚簇索引BTREE构建过程。
    

    辅助索引BTREE结构

    说明

    	使用普通列作为条件构建的优化
    

    作用

        优化非聚簇索引的查询速度。
    

    画图说明,辅助索引BTREE构建过程

    辅助索引的类型

    单列  
    联合 
    

    联合索引

    使用多列组合一个索引
    聚合索引 最左原则
    询条件中,必须要包含最左列,上列列子就算a列
    建立联合索引时,一定要选择重复至最少的列,作为最左列。
    

    全部覆盖

    select * from t1 where a= and b= and c=
    select * from t1 where a in and b in and c in
    select * from t1 where b = and c= and a=
    

    部分索引

    select * from t1 where a =  and b=
    select * from t1 where a =
    select * from t1 where a= and c=  不走索引
    select * from t1 where a= and b > < >= <= like and c= 不走索引
    select * from t1 where a order by b
    不覆盖
    bc
    b
    c
    

    前缀索引

    前缀索引是针对于,我们所选择的索引列值长度过长,会导致索引树高度变高。导致io次数变多,需要读取更多的数据页。
    mysql中建议索引树高度3-4层 如果1行是1k数据的话 大约实在2000w左右 3层
    

    b+tree 索引树高度影响因素

    1.索引字段较长  前缀索引
    2.数据行过多    分区表 归档表(pt-archive) 分布式架构
    3.数据类型      使用合适的数据类型
    

    唯一

    唯一索引 当列值只能唯一 不可重复
    

    下标索引

    B+tree索引高度影响因素
    索引字段较长    前缀索引
    数据行过多  分表   归档表    pt-archive ,分布式架构
    数据类型 varchar 类型 可变   char类型直接占用  如果能用enum就用enum
    

    什么时候创建索引

    按照业务语句的需求创建合适的索引,并不是将所有列都创建索引。
    将索引建立在 经常where group by order by join on 。。。的条件
    

    为什么不能乱建立索引?

    如果冗余索引过多,表的数据变化的时候,很有可能会导致索引频繁更新。阻塞很多正常的业务更新的请求。
    索引过多,会导致优化器出现偏差。
    

    管理命令

    查看表的索引情况
    desc table
    PRI 聚集索引   MUL辅助索引    UNI唯一索引
    show index from table;
    

    建立索引

    分析业务语句
    	select * from city where name = “”;
    创建索引
        alter table city add index idx-cityname(name);
        CREATE INDEX name_index ON user(name);
        ALTER TABLE user ADD UNIQUE login_name_index(login_name,user_type);
    

    删除索引

    alter table city drop index——na;
    

    修改索引

    DROP INDEX login_name_index ON user; 
    ALTER TABLE user ADD UNIQUE login_name_index(login_name);
    

    压力测试

    source .sql
    压测命令
    
    mysqllap --defaults-file=/etc/my.cnf  
    --concurrency=1000 --iteratior=1 --create-schema='test' --query ="select * from tetst.t100w where k2='780p'" engine=innodb --number-of-queries=2000 -u root -p 123 -verbose
    
    alter table city add index idx——d(district(5))
    

    其他类型的数据库

    mongodb
    es         solr
    hadoop     hbase
    

    什么是回表

    mysql用来存储数据行的逻辑结构,表的数据行最终存储到了很多的page上,
    Innodb存储引擎,成为了聚集索引的叶子节点,你可以认为聚集索引就算元表数据。
    所以,回表即是,回聚集聚促索引。
    

    什么时候回表

    辅助索引:将辅助索引列支+ ID主健,构建辅助索引B树结构
    
    用户使用,辅助索引作为条件查询时,首先扫描辅助索引的B树
    
    	1.如果辅助索引能够完全覆盖我们的查询结果时,就不需要回表了。
    
    	2.如果不能完全覆盖到,只能通过的出的id主建值,回到聚集索引(回表)扫描,最终得到想要的结果。
    

    回表会带来什么影响

    1.IO量级变大
    
    2.IOPS会增大
    
    3.随即IO会增大
    

    怎么减少回表

    1.将查询尽可能用id主键查询
    
    2.设计合理的联合索引
    
    完全覆盖
    
    更准确的查找条件+联合索引
    
    优化器算法:MRR 
    

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

    比如 insert 一行数据
    对于聚集索引会立即更新
    对于辅助索引,不是实时更新的。
    在INNODB 内存结构中 ,加入了insert buffer 会话级别 ,现在版本叫change buffer
    C 聚集
    S 辅助
    change buffer 功能是临时缓冲辅助索引需要的数据更新
    
    当我们需要查询新insert的数据 , 会在内存中进行merge(合并)操作,此时辅助索引就是最新的。
    

    并发过高 如何处理

    双11的时候,并发度太高,提前1-2周将热点商品数据,保存至Tair(redis,memcached)集群中。
    图片 放入到cdn中
    KAFKA  订单放入队列 , 慢慢消费。
    

    不走索引

    通过工具日至 showlog 收集不走索引的语句
  • 相关阅读:
    010_STM32CubeMXADC
    009_STM32CubeMXPWM
    008_STM32CubeMX定时器中断
    007_STM32CubeMX外部中断
    006_STM32CubeMX按键输入
    005_STM32CubeMX串口
    004_STM32CubeMX官方例程
    003_STM32CubeMX点灯
    002_STM32CubeMX配置基础工程
    006_word发表博客到博客园中
  • 原文地址:https://www.cnblogs.com/hywhyme/p/14552278.html
Copyright © 2011-2022 走看看