• 索引优化策略


    1、索引类型

       B-tree索引:能快速排好序的索引

       hash索引:在memory表里,默认是hash索引,hash的理论查询时间复杂度为O(1)

     
    既然hash的查找如此高效,为什么不都用hash索引?

    1:hash函数计算后的结果,是随机的,如果是在磁盘上放置数据,

    以主键为id为例, 那么随着id的增长, id对应的行,在磁盘上随机放置.

    2: 不法对范围查询进行优化.

    3: 无法利用前缀索引. 比如 btree, field列的值“hellopworld”,并加索引

    查询 xx=helloword,自然可以利用索引, xx=hello,也可以利用索引. (左前缀索引)

    因为hash(‘helloword’),hash(‘hello’),两者的关系仍为随机

    4: 排序也无法优化.

    5: 必须回行.就是说 通过索引拿到数据位置,必须回到表中取数据

     

     btree索引的常见误区

    1、在where条件常用的列上都加上索引

      : where cat_id=3 and price>100 ; //查询第3个栏目,100元以上的商品

      : cat_id,, price上都加上索引.

      : 只能用上cat_idPrice索引,因为是独立的索引,同时只能用上1

     

    2、在多列上建立索引后,查询哪个列,索引都将发挥作用

    : 多列索引上,索引发挥作用,需要满足左前缀要求

    index(a,b,c) 为例,

     

    语句

    索引是否发挥作用

    Where a=3

    ,只使用了a

    Where a=3 and b=5

    ,使用了a,b

    Where a=3 and b=5 and c=4

    ,使用了abc

    Where b=3  /  where c=4

    Where a=3 and c=4

    a列能发挥索引,c不能

    Where a=3 and b>10 and c=7

    A能利用,b能利用, C不能利用

    同上,where a=3 and b like ‘xxxx%’ and c=7

    A能用,B能用,C不能用

     

     

     

    中1:索引类型

      1.1 B-tree索引

      : 名叫btree索引,大的方面看,都用的平衡树,但具体的实现上, 各引擎稍有不同,

    比如,严格的说,NDB引擎,使用的是T-tree

      Myisam,innodb,默认用B-tree索引

     

    但抽象一下---B-tree系统,可理解为排好序的快速查找结构”. 

     

    1.2 hash索引

         memory表里,默认是hash索引, hash的理论查询时间复杂度为O(1)

     

    疑问: 既然hash的查找如此高效,为什么不都用hash索引?

    :

    1:hash函数计算后的结果,是随机的,如果是在磁盘上放置数据,

    比主键为id为例, 那么随着id的增长, id对应的行,在磁盘上随机放置.

    2: 不法对范围查询进行优化.

    3: 无法利用前缀索引. 比如 btree, field列的值“hellopworld”,并加索引

    查询 xx=helloword,自然可以利用索引, xx=hello,也可以利用索引. (左前缀索引)

    因为hash(‘helloword’),hash(‘hello’),两者的关系仍为随机

    4: 排序也无法优化.

    5: 必须回行.就是说 通过索引拿到数据位置,必须回到表中取数据

     

    2: btree索引的常见误区

     2.1 where条件常用的列上都加上索引

      : where cat_id=3 and price>100 ; //查询第3个栏目,100元以上的商品

      : cat_id,, price上都加上索引.

      : 只能用上cat_idPrice索引,因为是独立的索引,同时只能用上1.

     

     2.2 在多列上建立索引后,查询哪个列,索引都将发挥作用

    : 多列索引上,索引发挥作用,需要满足左前缀要求.

    index(a,b,c) 为例,

    语句

    索引是否发挥作用

    Where a=3

    ,只使用了a

    Where a=3 and b=5

    ,使用了a,b

    Where a=3 and b=5 and c=4

    ,使用了abc

    Where b=3  /  where c=4

    Where a=3 and c=4

    a列能发挥索引,c不能

    Where a=3 and b>10 and c=7

    A能利用,b能利用, C不能利用

    同上,where a=3 and b like ‘xxxx%’ and c=7

    A能用,B能用,C不能用

     

     

          

    为便于理解, 假设ABC10米长的木板, 河面宽30.

    全值索引是则木板长10,

    Like,左前缀及范围查询, 则木板长6,

     

    自己拼接一下,能否过河对岸,就知道索引能否利用上.

    如上例中, where a=3 and b>10, and c=7,

    A板长10,A列索引发挥作用

    A板正常接B, B板索引发挥作用

    B板短了,接不到C, C列的索引不发挥作用.

  • 相关阅读:
    2015总结
    iOS逆向分析app
    Unknow Unknow
    mac配置nginx
    Mac后台开发MNMP(nginx , mysql, php)标配
    15.BOM
    12.内置对象
    13.面向对象与继承
    10.变量、作用域及内存
    11.基本包装类型
  • 原文地址:https://www.cnblogs.com/WQLLL/p/11498228.html
Copyright © 2020-2023  润新知