java集合串讲arraylist结构数组扩容新增数组扩容为1.5倍如果容量仍然不够按传入的大小如果超过整数最大值使用整数最大值。场景连续存储按索引访问读取非尾部插入需要让其他大量元素后移linkedlist结构双向链表无需新申请内存扩容无法按索引读取需要遍历写也需要遍历到元素前方插入但不需要移动大量元素。hashmap:整体不线程安全多线程插入导致数据覆盖1.7 结构数组链表get和put与1.8类似区别在于扩容和没有树扩容使用头插法头插法在多线程插入扩容的时候新桶的链表为倒序举例对于a-b-null线程1操作ea,nextb线程1暂停线程2操作把a-b-null变为b-a-null放到新桶此时链表为线程1操作a.next b newtab a此时变为newtab-a-b形成双向链表无限扩容下去1.8 结构数组链表 红黑树get和put类似区别在于扩容时候是尾插高低位链表dget对key哈希扰动算出位置如果桶里没有节点返回空如果是链表遍历链表找到key相同的节点返回value如果是树在树上找时间为lognput对key哈希扰动算出位置如果桶里没有节点new节点插入如果是链表遍历链表找到key相同的节点覆盖value如果都不相同判断链表长度是否大于8不大于8尾插法插到尾部不确定是否是尾插法如果是树先判断下是否需要扩容如果数组不大于64就扩容扩容原理为新申请一块2倍的数组对老数据进行迁移用n-1hash(key)计算插入到oldsize或者oldsizen位置遍历每个桶用尾插法插入到新位置链表顺序倒序链表类型和树类型都重新插入如果不大于8保持链表大于8对新桶树化操作新数据也按这个逻辑插入到新数组否则插入到树里。concurrenthashmap:1.71.8linkedhashmap:和hashmap相比每个数据组合成双向链表copyandwriteList结构数组扩容读不加锁按索引位置读每次写会加lock锁然后申请一块大小的数组把原数据拷贝进来mysql:架构服务器端连接器管理连接生命周期查询操作走缓存语法分析器分析词法和语法优化器生成执行计划包括索引选择连接顺序临时表选用执行器按执行计划调用引擎接口返回结果引擎可插拔支持多种。缓存在5的版本里存在缓存了sql和结果集每次表更新会导致所在表失效sql完全一致才可以命中语法顺序ON ... AND ...是在“连接过程中”起作用决定右表能不能匹配上。WHERE是在“连接完成之后”起作用对最终结果做过滤。索引结构b树每个节点存放索引指针叶子结点存放索引数据且是双向链表每个节点按page_size设置查询一个节点的时候如果节点数据在bufferpool直接读取否则做一次磁盘io然后放入页缓存b树叶子结点无链表指针所有节点都存数据范围查询需要中序遍历二叉搜索树左小于根小于右极端退化为链表红黑树二叉树高不会退化为链表索引类型聚簇索引也叫主键索引叶子结点包含全部数据非聚簇索引也叫二级索引覆盖索引就是一次查询直接在叶子结点拿到所有不需要回表联合索引多个列组成索引按最左前缀原则查询保证索引有效索引失效1、一类是b树失效对索引列计算函数类型转换%开头不符合最左前缀范围查询后的索引列失效2、一类是优化器选择不走因为全表扫描在树里是有序链表物理上是顺序io基于预读机制把连续的页会加载入缓存索引区分度低比如性别用索引查只过滤一半还要再大量回表范围查询覆盖多还要回表or部分无索引日志redo顺序循环写入物理页修改保证持久性服务崩溃可以还原后写数据页可以延迟刷盘undo版本数据用于事务失败回滚和mvccredo prepare 、binlog 完整、redo commit 崩溃发生在1和2之间回滚redo发生在2和3之间提交redo保证主从一致锁表锁锁住整个表mysam引擎只支持表锁行锁锁住索引mysam引擎无插入意向锁对间隙加锁意向锁对表加锁共享锁和共享锁不互斥和排他锁互斥排他锁和排他锁共享锁互斥记录锁锁索引记录唯一索引/主键等值查询间隙锁锁行的间隙记录间隙锁锁行间隙四大特性持久性redolog先读入缓存然后在缓存里改为脏页然后把物理修改写入redolog缓存再让redolog刷盘落盘之后事务提交完成让数据页修改异步刷盘如果redolog写完之前崩溃事务没提交修改丢失如果redolog落盘之后崩溃事务已提交用redolog恢复数据修改。隔离性四种隔离级别mvcc锁间隙锁读视图来保证原子性事务undolog一致性通过以上三种保证数据的完整和一致隔离级别读未提交事务未提交也可以被其他事务读到导致脏读不可重复读幻读读已提交事务提交才可以被其他事务读到导致不可重复读幻读可重复读同一条数据反复读取无差异基于mvcc存在幻读innodb解决幻读串行读允许并发事务但通过加锁让它们串行化执行。mvccrc下每次查询生成一个readviewrr下复用一个readviewReadView 存creator_trx_id、m_ids当前活跃事务id集合、min_id是mids的最小id、max_id是下一个要创建的事务id。判断自己的可见小于 min 可见中间看是否在 m_ids 里不在则可见大于等于 max 不可见。沿 undo 版本链找第一个可见版本。快照读mvcc读视图解决幻读新插入的行事务id肯定大于读视图的最大事务id不可见当前读间隙锁更新删除操作查询 for update有索引给索引范围加锁无索引锁表死锁两个事务互相持有对方需要的锁循环等待注意和锁等待的区分解决分批缩短事务走索引避免全表扫描事务顺序。性能优化慢sql定位索引优化索引原则索引数量不要太多会增加优化器分析时间插入更新也会更久索引列区分度最大的放在联合索引最左边避免冗余索引增加优化器时间覆盖索引避免回表随机io表结构优化一起使用的列放在同一个表里避免连接查询文件类型只放地址字符串转数字类型存储比如ip存数字列定义为not nullnull占用空间比较和运算要对null特殊处理sql优化避免使用SELECT *、尽量使用具体字段、使用连接查询代替子查询子查询会产生临时表没有索引避免join太多的表可能内存溢出合理使用批量操作批量的读取避免大批量写会造成大事务主从延迟久大表ddl用pt-online-schema-change避免大表修改产生的主从延迟。避免在对表字段进行修改时进行锁表。读写分离分库分表冷热分离缓存其他手段硬件连接池配置集群主从分库分表redis:和mem的对比架构执行数据结构原理日志锁哨兵集群消息队列选型差异架构差异顺序持久性不丢失集群分布式分布式事务id锁jvm结构类加载垃圾回收问题排查框架场景题