Mysql索引优化
二叉树
红黑树
Hash表
B-Tree(B树)
先从根节点(每个节点16k)查找,根节点(常驻内存)
索引的底层数据结构
B+Tree(B+树)
先从根节点(每个节点16k)查找,根节点(常驻内存)
可以存储1170*1170*16个索引
数据库存储引擎(是形容存储的表的结构)(不同表的底层存储的数据结构可能不同)
索引最后找到的是索引所在行的磁盘地址指针(数据和索引所指的数据的存储是分开的,非聚集索引)
聚集索引就是叶子节点和数据的值是放在一起的(数据和索引所指的数据是存储到一起的)
B+树必须使用主键来维护B+树的数据结构,整形的数据比较比较快,存储空间更小
可以使用指针直接查询到相邻的查询节点,不用再次从根节点查询(同层级从左至右依次递增)
联合索引
一个索引中存储多个数据,从上至下按照字段一次查询
JMM内存模型
Java线程内存模型
每次线程工作时,会从主内存的共享变量中拷贝一份到一个线程的工作内存中,
该线程操作完的数据不会与其他线程共享,也不会再次写入到主内存
可以使用 volatile 关键字使数据被多个线程共享操作(保证变量对多个线程的可见性)
JMM数据原子操作(使用原子操作进行线程之间的数据操作)
总线加锁(多线程数据可见性早期的解决方案)
MESI缓存一致性
如果开启了缓存一致性协议,当一个线程把数据修改了,会立即同步回主内存的数据,
其他开启缓存一致性协议的线程会监听着总线,发现数值失效后也会立即从主内存到各自线程内部的数据
Volatile可见性底层原理
Volatile底层是C语言实现的,可以看汇编语言
汇编的lock加锁操作,是在同步会主内存时,只能该同步的线程操作,只有当主内存同步完成后锁才会释放