如果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’);
尽量的扩展索引,不要新建索引