从千万级数据查询,来聊一聊索引结构和数据库原理( 三 )


将索引的数据类型是设置为整型 , 一来占有的磁盘空间或内存空间更少 , 另一方面整型相对于字符串比较更快速 , 而字符串需要先转换为ASCII码然后再一个个进行比较的 。
参见B+树的图它本质上是多路多叉树 , 如果主键索引不是自增的 , 那么后续插入的索引就会引起B+树的其他节点的分裂和重新平衡 , 影响数据插入的效率 , 如果是自增主键 , 只用在尾节点做增加就可以 。
最后特别强调一点:不管当前是否有性能要求或者数据量多大 , 千万不要使用UUID作为索引 。
2.4 为什么Mysql存储引擎中默认每个页的大小为16KB?假设我们一行数据大小为1K , 那么一页就能存16条数据 , 包含指针+数据+索引 。假设一行数据大小为1K , 那么一页(1个叶子节点)就能存16条数据;对于非叶子节点 , 假设ID为bigint类型那么长度为8B , 指针大小在Innodb源码中为6B , 一共就是14B , 那么一页里就可以存储16K/14=1170个(主键+指针) , 这样一颗高度为3的B+树能存储的数据为:1170117016=2千万级别 。所以我们前面1000万的数据只有0.02s 。
2.5 HASH算法的使用场景

从千万级数据查询,来聊一聊索引结构和数据库原理

文章插图
 
Hash算法是一种散列算法 , 就是计算出某个字段的hash , 然后存放在对应的地址中 , 查找数据时只需要1次定位而不像BTree那样从根节点找到叶子节点经过多次IO操作 , 所以查询效率非常地高 。但同样也有很多的弊端 , 讲一下最重要的两条 。1、很明显hash只支持=、IN等查询 , 而不支持范围查询2、 Hash 索引在任何时候都不能避免表扫描 。
所以使用时务必注意 。

【从千万级数据查询,来聊一聊索引结构和数据库原理】


推荐阅读