• 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

  • 相关阅读:
    linux 中rz sz 文件传输
    linux find 命令
    深度学习的博客
    cifar10数据的转换、代码解释
    gflags的使用实例(转载)
    leveldb使用 (转载)
    (转载+整理)Leveldb安装及例子
    2013-09-25-【随笔】-Roy
    2013-09-22 [随笔]-Roy
    2013-08-12【随笔2】-Roy
  • 原文地址:https://www.cnblogs.com/cxli99/p/13883986.html
Copyright © 2020-2023  润新知