索引
大部分数据库索引底层为平衡二叉树,B Tree B+Tree树
一个没有主键的表,存储在磁盘中时,是无序存储的,也就是一行行数据存储。如果加上了主键,那么表就会以树状结构存储,整个表就是一个索引,这就是聚集索引,主键的作用就是把表的数据格式转换成索引的格式放置
当查找条件为主键时,会遍历树节点,找到结果表数据。
平衡树结构就是为了减少查询所消费的时间,如果是无序结构存储,一次查询最坏可能需要全部遍历一遍,而平衡树结构树的层数就是查询次数。而又是由于平衡树结构问题,在增加新的节点或删除节点时,为了保持树的平衡特性,那么需要对树进行重新排列,重新将树梳理为平衡树,这也带来了性能开销。
聚集索引树的节点是表的主键字段,而平常所用的索引为非聚集索引,可以自己选择字段建立索引,那么树的节点就是所选择的索引字段,每个索引字段都会形成一颗平衡二叉树被复制出来单独存储,所以建立索引会增加表的存储空间。
查找顺序:
通过聚集索引可以根据主键找到对应的表数据,而非聚集索引查找,则是先通过索引字段内容找到对应的主键值,再通过主键值的聚集索引,找到对应的表数据
通常情况下,聚集索引是唯一找到表数据的方法,而存在一种覆盖索引查询,也就是复合索引或多字段索引,同时建立两个字段的索引,条件为A字段,查询结果为B字段,那么这样就不需要通过A字段找到主键,再找到表信息中的B字段值,而是直接通过A字段找到对应的B字段值
分库分表
- 按功能划分表,三范式,适合根据业务逻辑划分
- 按规则划分表,如每天一个表,不同性别存放不同的表,适合单表内容过多
分库分表存在的问题
- 分库会出现事务管理问题
不同数据库不方便统一进行事务回滚,而用分布式事务管理功能则性能消耗过多,若将不同库的事务交由程序去管理,则增加了编程方面的负担。
- 跨库跨表连接问题
原本一次查询即可得到的结果,可能需要多次查询,且切换数据源