索引
通过数据的冗余和预计算,以减少io次数和逻辑判断的消耗,最终提高查询的速度。
例如经典的B+树索引vs LSM-tree索引。LSM-Tree索引写是O(1),读是O(N);B+树读写都是O(logN),tokudb的fractal tree介于两者之间。
索引的副作用
索引的加载、修改,会带来额外的IO和锁的消耗。
位图索引
位图索引本质上是列存储,对于取值离散范围较小的列,每个值存一个位图。恰好满足了三星索引的第三星要求,查询满足满足特定列某个取值的主键(例如所有性能都为男性的学生的ID),其数据全部都在索引之中。
堆表vs索引表
索引表在经过大量插入删除后,会存储在老化问题,既数据块在磁盘上分布不够连续,二是离散的。
堆表,数据块本省不存在老化问题,但是如果对表上的索引较多,会插入删除时,需要锁定、修改对应的索引块,效率比较低。索引表的二级索引是间接索引,不存在该啥问题。
协程
最好是编程语言native方式支持,否则会有些额外的问题(C的routine CPU需要显示调用一个yield函数)。
应用于RPC或者session较多的场景,底层实现是异步IO,应用编程是同步IO,提高开发效率。
cpu cache
通过一个hash映射的方法,将memory地址空间映射为cache的地址空间,关键问题是:提高hash表的空间利用率,减少hash冲突,均匀hot key的分布以减少cache miss。
Bloom Filter
通过多维hash的方式减少hash冲突,只记录原始key的很小一部分(位图)以提高空间利用率。
spin lock
忙等非睡眠锁,当CPU轮询忙等的时间远远小于进程/线程上下文切换时间时,it work。