数据库
- MyISAM 只有表级锁,而InnoDB 支持行级锁
- MyISAM 性能优于 InnoDB
- 红黑树为什么不能作为索引:曾经多》读取磁盘IO次数多》读取浪费(磁盘页资源部充分使用)
- MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
- InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。 PS:整理自《Java工程师修炼之道》
redis缓存
切片集群(数据分多片,适合数据多场景,一致性hash算法解决平滑扩容),主备集群
- 解决:查询放入null值,用布隆过滤器
- 解决:首次查询mysql加分布式锁,查询到数据入redis解锁,解决并发读库问题
- 解决:设置随机缓存值,防止同时失效
数据结构和算法
HashMap
- 数据:查询快 查时间复杂度o(1) 插o(N)
- 链表:插入快 反之
- put时:key,value,key.hashCode(),next 链表引用;计算Math.abs(key.hashCode())%15–存储位置
当发现存储位置有元素时,查看next元素是否为空,进行插入,当链表元素过多是–红黑树(查询快)- get时:key–key.hashCode()–拿到下标去查找,进行key和key.hashCode()比较–不一致 获取next元素递归查找
二叉树:
- 除根节点和叶子节点外,都有两个子节点
- 小的放左边,大的放右边
- 从任何一个节点出发,左右子树深度之差的绝对值不超过1
- 左右子树仍然为平衡二叉树。
- 节点是红色或黑色,根节点是黑色。
- 每个叶子节点(NIL)都是黑色的空节点。
- 从根节点到叶子节点,不会出现两个连续的红色节点。
- 从任何一个节点出发,到叶子节点,这条路径上都有相同数目的黑色节点。
InnoDB存储引擎中有页(Page)的概念(磁盘管理的最小单位16KB),InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块,一棵m阶的B-Tree有如下特性:
- 每个节点最多有m个孩子。
- 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
- 若根节点不是叶子节点,则至少有2个孩子
- 所有叶子节点都在同一层,且不包含其它关键字信息
- 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
- 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
- ki(i=1,…n)为关键字,且关键字升序排序。
- Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)。
B+Tree是在B-Tree基础上的一种优化,在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
B+Tree相对于B-Tree有几点不同:
- 非叶子节点只存储键值信息。
- 所有叶子节点之间都有一个链指针(双向链表:范围查找)。
- 数据记录都存放在叶子节点中。
扩展:阶怎么来?
根据页(16k)除以数据大小来的,所以建的索引值越小,阶数越大,层级越浅回表IO越少,唯一索引可以减少裂变。
标识数据算法,bit[]的每一位用0或1标识是否存在,通过错误了换取空间的思想
布隆算法特性:
- 将key通过hash()算法 得到数组下标存放入redis的bitMap[]数组内。
- 正确的不一定正确,错误的一定错误:存在hash碰撞问题
- hash算法的个数和数组大小会影响错误率,时间换空间思想
hash一致性算法:
- 将key和机器进行 2的32次方取模,映射值分布到hash环上
- 最多只有两个分片进行数据迁移
- hash算法的个数和数组大小会影响错误率,时间换空间思想