• 网易DBA私享会分享会笔记2


    mysql索引与查询优化
    什么是索引?索引其实是一个目录。通过各种数据结构实现,是(值=>行位置)的映射

    索引的作用:
    1.提高访问速度
    2.实现主键、唯一键逻辑

    索引使用场景
    数据量特别大的时候,进行全表扫描(无索引),就会很慢,有索引的话就会减少I/O,减少时间(等值查询)

    索引的类型:指的是实现索引的数据结构
    Btree索引,实际上是B+tree,Mysql甚至绝大部分是RDBMS是最主要的架构
    Hash索引:主要是用于Innodb,一些内存索引结构,一家MEMORY存储引擎
    RTree索引(淘汰):用于地理位置检索,MyIsam引擎专有
    fulltext索引 主要用于MyIsam引擎
    Bitmap索引(用的比较少) 原生的mysql不支持位图索引

    innodb聚簇索引与二级索引
    这个表本身也建成一个索引,按主键依次排序、
    二级索引:用户建的索引
    先找二级索引-->找到主键--->找到相应内容

    索引的代价
    插入、修改、删除操作,每一个索引都会变成一个内部事务,索引越长,事务越长(平衡二叉树)、

    索引的优势
    减少查询I/O 、等值查询/范围查询、有序特性(order by、group by、distinct、max、min)

    索引的常用用法
    1.根据where查询条件建立索引
    select a.b from table_a where c = ?; 在c上建立索引
    2.使用联合索引,而不是多个单列索引
    select * from tab_a where a=? And b=? //建立一个联合索引 idx_a_b(a,b)
    3.联合索引中索引字段的顺序,根据区分度排,区分度大的排前面 //区分度指的是 取值范围更广。比如name,而不是gender
    idx_smp(name,gender)

    索引的常见用法
    1.联合索引能为前缀单列、复列查询提供查询
    idx_smp(a,b,c)
    _where a=? or where a =? and b=?
    查询条件必须从左到右都包含,才能走abc

    同样的,合理创建联合索引,避免冗余

    查看是否使用索引:explain命令
    explain select userid from PRIS_trade where
    explain 是确定一个查询如何走索引的最简单有效方法
    关注项目:
    type:查询access方式
    key:本次查询最终使用哪个索引,null为未使用索引
    key_len:选择索引使用的前缀长度或者整个长度
    rows:可以理解为查询逻辑需要扫描过的记录行数
    extra:额外信息,主要指fetch data具体方式
    (执行计划)

    小结:
    对不确定的执行语句的关键语句上线前务必使用explain
    Type为null的要格外注意,避免全表扫描
    key_len只能用很少一部分前缀的要注意索引字段顺序
    Extra只看到Using filesort,Using tempotary都要尽量优化

    强制使用索引hint
    select * from table1 force index(field1)
    select * from table1 ingore index(field1)

  • 相关阅读:
    [20220314联考] 旅行
    [ZJOI2015] 地震后的幻想乡
    [20220315联考] 等你哈苏德
    [20220318联考] 无向图
    java线程池ThreadPoolTaskExecutor执行顺序
    数据结构单向链表的实现(内含c代码,已调试,可用)
    数据结构双向链表的实现(内含c代码,已调试,可用)
    Python回顾
    220221220223
    言论1
  • 原文地址:https://www.cnblogs.com/smartyman/p/5238859.html
Copyright © 2020-2023  润新知