zoukankan      html  css  js  c++  java
  • 使用伪hash降低索引长度

    理想的索引

    1:查询频繁 2:区分度高  3:长度小  4: 尽量能覆盖常用查询字段.

    1: 索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多).

    针对列中的值,从左往右截取部分,来建索引

    1: 截的越短, 重复度越高,区分度越小, 索引效果越不好

    2: 截的越长, 重复度越低,区分度越高, 索引效果越好,但带来的影响也越大--增删改变慢,并间影响查询速度.

    所以, 我们要在  区分度 + 长度  两者上,取得一个平衡.

    惯用手法: 截取不同长度,并测试其区分度,

    mysql> select count(distinct left(word,6))/count(*) from dict;

    +---------------------------------------+

    | count(distinct left(word,6))/count(*) |

    +---------------------------------------+

    |                                0.9992 |

    +---------------------------------------+

    1 row in set (0.30 sec)

     

    对于一般的系统应用: 区别度能达到0.1,索引的性能就可以接受.

    2:对于左前缀不易区分的列 ,建立索引的技巧

    如 url列

    http://www.baidu.com

    http://www.zixue.it

    列的前11个字符都是一样的,不易区分, 可以用如下2个办法来解决

    1: 把列内容倒过来存储,并建立索引

    Moc.udiab.www//:ptth

    Ti.euxiz.www//://ptth

    这样左前缀区分度大,

    2: 伪hash索引效果

    同时存 url_hash列

    3:多列索引

     3.1 多列索引的考虑因素--- 

    列的查询频率 , 列的区分度,

    以ecshop商城为例, goods表中的cat_id,brand_id,做多列索引

    从区分度看,Brand_id区分度更高,

    mysql> select count(distinct cat_id) / count(*) from  goods;

    +-----------------------------------+

    | count(distinct cat_id) / count(*) |

    +-----------------------------------+

    |                            0.2903 |

    +-----------------------------------+

    1 row in set (0.00 sec)

     

    mysql> select count(distinct brand_id) / count(*) from  goods;

    +-------------------------------------+

    | count(distinct brand_id) / count(*) |

    +-------------------------------------+

    |                              0.3871 |

    +-------------------------------------+

    1 row in set (0.00 sec)

    但从 商城的实际业务业务看, 顾客一般先选大分类->小分类->品牌,

    最终选择 index(cat_id,brand_id)来建立索引

  • 相关阅读:
    冲刺1
    第九周
    课堂作业
    团队项目典型用户与用户场景分析
    第八周
    梦断代码阅读笔记03
    tab页的使用方法
    校园服务nabcd需求分析
    第七周
    mysql下载以及安装
  • 原文地址:https://www.cnblogs.com/hgj123/p/5012864.html
Copyright © 2011-2022 走看看