八股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对最左前缀匹配查询做了点小优化,当查询语句不符合最左匹配原则时,会构造一个符合的来进行索引查询提高效率。做了解即可。

数据库的脏读,不可重复读和幻读分别是什么

  1. 脏读(Dirty Read)
    • 脏读指的是一个事务能够读取到另一个未提交事务修改的数据。如果该事务之后回滚,那么第一个事务实际上读取到了从未真正存在的数据。
    • 这种情况会导致数据的不一致性和潜在的应用逻辑错误。
  2. 不可重复读(Non-repeatable Read)
    • 不可重复读是指在一个事务中两次读取同一行数据得到不同的结果。这种情况发生在第一次读取之后、第二次读取之前,另一个事务对这行数据进行了更新并提交。
  3. 幻读(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操作。
  • 提高查询速度:索引比数据表更紧凑,因此从索引中读取数据比从表中读取要快。
  • 减少内存占用:只需要读取索引页而不是表数据页,可以减少内存占用。

MySQL的索引类型有哪些?

倒排索引和R-树索引不太懂,感觉也不需要懂,其他直接看文章就好,挺全面的。

posted @ 2025-01-01 23:37  Sha11ow  阅读(33)  评论(0)    收藏  举报