Mysql索引优化、JMM内存模型

Mysql索引优化

二叉树

红黑树

Hash表

B-Tree(B树)

先从根节点(每个节点16k)查找,根节点(常驻内存)

索引的底层数据结构

B+TreeB+树)

先从根节点(每个节点16k)查找,根节点(常驻内存)

可以存储1170*1170*16个索引

数据库存储引擎(是形容存储的表的结构)(不同表的底层存储的数据结构可能不同)

索引最后找到的是索引所在行的磁盘地址指针(数据和索引所指的数据的存储是分开的,非聚集索引)

   

聚集索引就是叶子节点和数据的值是放在一起的(数据和索引所指的数据是存储到一起的)

B+树必须使用主键来维护B+树的数据结构,整形的数据比较比较快,存储空间更小

可以使用指针直接查询到相邻的查询节点,不用再次从根节点查询(同层级从左至右依次递增)

   

联合索引

一个索引中存储多个数据,从上至下按照字段依次查询

   

JMM内存模型

Java线程内存模型

每次线程工作时,会从主内存的共享变量中拷贝一份到一个线程的工作内存中,

该线程操作完的数据不会与其他线程共享,也不会再次写入到主内存

   

可以使用 volatile 关键字使数据被多个线程共享操作(保证变量对多个线程的可见性)

   

JMM数据原子操作(使用原子操作进行线程之间的数据操作)

   

   

总线加锁(多线程数据可见性早期的解决方案

MESI缓存一致性

如果开启了缓存一致性协议,当一个线程把数据修改了,会立即同步回主内存的数据,

其他开启缓存一致性协议的线程会监听着总线,发现数值失效后也会立即从主内存到各自线程内部的数据

   

Volatile可见性底层原理

Volatile底层是C语言实现的,可以看汇编语言

汇编的lock加锁操作,是在同步会主内存时,只能该同步的线程操作,只有当主内存同步完成后锁才会释放

posted @ 2021-05-19 16:52  baicaiFX  阅读(62)  评论(0编辑  收藏  举报