zoukankan      html  css  js  c++  java
  • mysql索引知识

    mysql索引原理以及查询优化:https://www.cnblogs.com/bypp/p/7755307.html

    SQL优化的十大策略:

    一、尽量全值匹配:当建立了索引列后,在where条件中使用索引的尽量使用

    二、最佳左前缀法则:如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列

    三、不在索引列上做任何操作:在索引列上做任何操作(计算、函数(自动or手动)类型转换),会导致索引失效而转向全表扫描 (left、right)

    四、范围条件放最后:中间有范围查询会导致后面的索引列全部失效

    五、覆盖索引尽量用:尽量使用覆盖索引(只访问索引的查询:索引列和查询列一致),减少select *

    六、不等于要慎用:mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描,如果一定需要使用不等于,要使用覆盖索引

    七、null/not有影响:自定义为not null,在字段定义为not null的情况下,使用is null或is not null会失效,解决方式,可以使用覆盖索引;自定义为null或者不定义,is not null的情况会导致索引失效,解决方式,可以使用覆盖索引

    八、like查询要当心:like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作,解决方式,可以使用覆盖索引

    九、字符类型加引号:字符串不加单引号索引失效,解决方式,加上引号

    十、or改union效率高:解决方式,使用覆盖索引

     

    三星索引:

      对于一个查询而言,一个三星索引,可能是其最好的索引。如果查询使用三星索引,一次查询通常只需要进行一次磁盘随机读以及一次窄索引片的扫描,因此其相应时间通常比使用一个普通索引的响应时间少几个数量级。

      三星索引概念是在《Rrelational Database Index Design and the optimizers》一书中提出来的。原文如下:

      The index earns one star if it places relevant rows adjacent to each other,a second star if its rows are sorted in the order the query needs,and a final star if it contains all the columns needed for the query.

      索引将相关的记录放到一起则获得一星;如果索引中的数据顺序和查找中的排列顺序一致则获得二星;如果索引中的列包含了查询中需要的全部列则获得三星。

      二星(排序星):

      在满足一星的情况下,当查询需要排序,group by、order by,如果查询所需的顺序与索引是一致的(索引本身是有序的),是不是就可以不用再另外排序了,一般来说排序可是影响性能的关键因素。

      三星(宽索引星):

      在满足了二星的情况下,如果索引中所包含了这个查询所需的所有列(包括where 子句 和 select 子句中所需的列,也就是覆盖索引),这样一来,查询就不再需要回表了,减少了查询的步骤和 IO 请求次数,性能几乎可以提升一倍。

      一星按照原文稍微有点难以理解,其实它的意思就是:如果一个查询相关的索引行是相邻的或者至少相距足够靠近的话,必须扫描的索引片宽度就会缩至最短,也就是说,让索引片尽量变窄,也就是我们所说的索引的扫描范围越小越好。

      这三颗星,哪颗最重要?第三颗星。因为将一个列排除在索引之外可能会导致很多磁盘随机读(回表操作)。第一和第二颗星重要性差不多,可以理解为第三颗星比重是 50%,第一颗星为 27%,第二颗星为 23%,所以在大部分的情况下,会先考虑第一颗星,但会根据业务情况调整这两颗星的优先度。

      三星索引:https://zhuanlan.zhihu.com/p/140815969

    查看数据库表和索引占空间大小:http://www.maomao365.com/?p=9938

    select CONCAT(sum(index_length/(1024*1024)) ,'MB') as 'indexTotal'  from information_schema.TABLES WHERE table_schema LIKE '数据库名称';

    select CONCAT(sum(data_length/(1024*1024)) ,'MB') as 'indexTotal'  from information_schema.TABLES WHERE table_schema LIKE '数据库名称';

    hashmap数据结构:链表+数组(jdk1.7),链表+数组+红黑树(jdk1.8)

    数组默认长度:16

    hashmap初始值是16,扩容*2

    链表转成红黑树:链表的长度大于等于8,数组的长度大于等于64

    hash算法:

    二叉树查询数据次数是根据树的高度决定的,所以数据过多的时候查询次数多

    平衡二叉树缺点:(1)io次数过多,以页为单位(2)page是16kb,目标数据过少,io浪费

    使用B-Tree代替:

    B-Tree划分区间是左开右闭,
    5,20
    无穷小,5 开区间
    5
    5,20 开区间
    20
    20,无穷大 开区间
    查找关键字的时候,直接查找数据区去返回 io1次


    B+Tree划分区间是左闭右开
    1,28,66
    [1,28)
    [28,66)
    [66,无穷大)
    查找关键字的时候,还需要查找数据区 io3次


    B-Tree和B+Tree的区别
    1、关键字个数:路数=1:1
    2、只有叶子节点有数据区
    3、数据区间划分有所区别

    聚集索引B+Tree叶子节点包含了行的全部数据,二级索引的叶子节点除了索引列值,还存这一列对应的主键值。

    InnoDB聚集索引B+Tree叶子节点存储了整个表的数据,而不是只有索引列,每个叶子节点包含了主键值、事务ID、用于事务和MVCC的回滚指针以及所有的剩余列(col2),二级索引的叶子节点中存储的不是“行指针”,而是主键值,并以此作为指向行的“指针”。

    Linux安装rocketmq:https://www.cnblogs.com/dalaoyang/p/10165976.html

    mysql索引数据结构:https://www.cnblogs.com/yuanrw/p/10225659.html

  • 相关阅读:
    How to build Linux system from kernel to UI layer
    Writing USB driver for Android
    Xposed Framework for Android 8.x Oreo is released (in beta)
    Linux Smartphone Operating Systems You Can Install Today
    Librem 5 Leads New Wave of Open Source Mobile Linux Contenders
    GUADEC: porting GNOME to Android
    Librem 5 – A Security and Privacy Focused Phone
    GNOME and KDE Join Librem 5 Linux Smartphone Party
    Purism计划推出安全开源的Linux Librem 5智能手机
    国产系统之殇:你知道的这些系统都是国外的
  • 原文地址:https://www.cnblogs.com/cxli99/p/13883986.html
Copyright © 2011-2022 走看看