MySQL 索引解析

12 篇文章 0 订阅

如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN
    
    
    通过上面的分析,我们知道IO次数取决于b+数的高度 h,
    假设当前数据表的数据为 N,
    每个磁盘块的数据项的数量是 m,
    
    则有h=㏒(m+1)N,
    
    当数据量N一定的情况下,m越大,h越小;
    
    而m = 磁盘块的大小(固定) / 数据项的大小,  大
    
    磁盘块的大小也就是一个数据页的大小,是固定的,
    如果数据项占的空间越小,数据项的数量越多,树的高度越低。
    这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。
    这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,
    一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。
    当数据项等于1时将会退化成线性表。
    
    即索引的最左匹配特性。
    
    mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配
    
    =和in可以乱序
    
    尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,
    而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?
    使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录
    
    索引列不能参与计算
        from_unixtime(create_time) = ’2014-05-29’
        create_time = unix_timestamp(’2014-05-29’);
    
    尽量的扩展索引,不要新建索引
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值