八股day2
Java有哪些集合类
- 两大类:Collection接口和Map接口
Set接口:
- HashSet:基于哈希表,元素无序不允许重复
- LinkedHashSet:基于链表和哈希表,有序不重复
- TreeSet:基于红黑树,有序不重复
Map:
- Hashtable:线程安全的哈希表,不允许键或值为null
- ConcurrentHashMap:线程安全的哈希表,适合高并发环境,不允许键或值为null
LinkedHashMap内部有一些针对插入结点前后的一些操作,可以改成LRU算法
private static final class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int maxCacheSize;
LRUCache(int initialCapacity, int maxCacheSize) {
super(initialCapacity, 0.75F, true);
this.maxCacheSize = maxCacheSize;
}
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return this.size() > this.maxCacheSize;
}
}
MySQL索引的最左前缀匹配原则
- MySQL索引的最左前缀匹配原则指的是在使用联合索引时,查询条件必须从索引的最左侧开始匹配。
- 底层原理:因为联合索引在B+树中是从左到右顺序查找的。
- 索引查询相当于o(1)比全表扫描o(n)快得多(不一定准确打个比方)。
索引下推
- 索引下推是在MySQL5.6版本之后的一个功能。是针对联合索引的,比如当select * from user where a>1 b=0,此时因为不满足最左前缀匹配原则,b索引失效,不使用索引下推时会传递到server层回表再过滤,而使用了索引下推会在引擎层把剩下的条件b=0过滤。减少了回表次数,提高了查询效率。
- 多次回表通常发生在非覆盖索引的情况下,即索引并不包含查询所需的所有列,因此必须返回数据表来取得缺失的信息。
- server层回表相较于引擎层过滤不仅查询更多次,还会增加io开销。
注意范围查询
- 理解联合索引的顺序:例如(a,b,c),在b+树中的排序是先按a的值排序,如果a的值相同,则按b的值排序,如果b的值相同,再按c的值排序。所以如果遇到范围查询(>,<)就会停止匹配。因为在a值不等的(a,b,c)中,b和c就算无序的,无法利用索引查询。
扩展
- MySQL8对最左前缀匹配查询做了点小优化,当查询语句不符合最左匹配原则时,会构造一个符合的来进行索引查询提高效率。做了解即可。
数据库的脏读,不可重复读和幻读分别是什么
- 脏读(Dirty Read):
- 脏读指的是一个事务能够读取到另一个未提交事务修改的数据。如果该事务之后回滚,那么第一个事务实际上读取到了从未真正存在的数据。
- 这种情况会导致数据的不一致性和潜在的应用逻辑错误。
- 不可重复读(Non-repeatable Read):
- 不可重复读是指在一个事务中两次读取同一行数据得到不同的结果。这种情况发生在第一次读取之后、第二次读取之前,另一个事务对这行数据进行了更新并提交。
- 幻读(Phantom Read):
- 幻读是指在一个事务中执行相同的查询两次或多次,但每次得到的结果集不同。这通常是因为在两次查询之间有其他事务插入了新的行,或者删除了现有行,导致结果集中出现了“幻影”行。
SQL标准定义了四种事务隔离级别,从低到高分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和序列化(Serializable)。
几种读与隔离级别的关系:
- 读未提交允许脏读
- 读已提交防止脏读,但可能出现不可重复读
- 可重复度防前二者,但仍可出现幻读。
- 串行化防止三者,但性能开销大
不可重复读与幻读区别
- 幻读针对的是对数据总量的变化
- 不可重复读是针对的同一条数据的内容
MySQL的存储引擎有哪些?它们之间有什么区别?
InnoDB:
- 它支持事务处理(ACID兼容)、回滚、崩溃修复能力和多版本并发控制(MVCC)。
- InnoDB 支持行级锁定,这意味着在高并发环境中性能较好,并且它还支持外键约束,有助于确保数据的一致性和完整性。
- InnoDB 的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。然而,它的读写效率可能比 MyISAM 稍差,占用的数据空间也相对较大。
MyISAM:
- MyISAM 不支持事务、回滚或外键,但它提供表级锁,对于以读操作为主的场景有较好的性能表现。
- MyISAM 占用的空间较小,处理速度较快,尤其适合于只读或主要为插入新记录和读出记录的应用。
- MyISAM 表可以被压缩以节省空间,但是不支持对已压缩表的更新。
MEMORY(以前称为HEAP):
- 每个基于 MEMORY 的表对应一个磁盘上的 .frm 文件,用于存储表结构,而数据则完全保存在内存中。
- 默认情况下,MEMORY 使用哈希索引,这使得查找特定值的速度非常快;也可以选择 B-Tree 索引来支持范围查询。
- MEMORY 表的一个显著缺点是它们的数据是非持久性的——如果服务器重启或关闭,所有的数据都会丢失。
- 这种存储引擎适用于需要快速访问临时数据的情况,例如缓存结果集或者作为其他更慢速存储引擎的代理。
扩展知识:
- 聚集索引(Clustered Index):每个表只能有一个聚集索引,因为数据的物理排序方式只能有一种。当一个表有聚集索引时,表的数据行会被按照聚集索引键值的逻辑顺序进行物理存储。这意味着,聚集索引不仅定义了数据行的逻辑顺序,还直接决定了它们在磁盘上的物理存放位置。
MySQL的覆盖索引是什么
- 是指二级索引中包含了查询所需的所有字段,从而使查询可以仅通过访问二级索引而不需要访问实际的表数据(主键索引)。
优点:
- 减少IO操作:因为查询可以直接从索引中获取所有需要的数据,避免了访问实际表的数据页,从而减少了IO操作。
- 提高查询速度:索引比数据表更紧凑,因此从索引中读取数据比从表中读取要快。
- 减少内存占用:只需要读取索引页而不是表数据页,可以减少内存占用。
倒排索引和R-树索引不太懂,感觉也不需要懂,其他直接看文章就好,挺全面的。

浙公网安备 33010602011771号