2025.2.17 学习
2025.2.17 学习
八股
1.ThreadLocal
在某些不需要多线程共享变量的场景下,我们需要为每一个线程提供一个独立的变量来供其使用,比获取当前登录用户的信息,建立与数据库的连接,这两个场景都不存在多线程竞争同一变量的情况,而是需要为每个线程创建一个独立的变量。这样我们就可以用ThreadLocal
concurrentHashMap
线程安全,锁特定链表/红黑树
HashMap
线程不安全
HashTable
线程安全,锁整个表,粒度大速度慢,很早之前的类了现在已经很少用
jdk
1.7和1.8版本concurrentHashMap
的变化:1.7根据段segment
去上锁,每个哈希表被分成最高16个段,扩容和上锁操作都是在段的层面上去进行的。1.8舍去了段,改为以node
节点的粒度来上锁。同时扩容上也有改变:
最左匹配原则
Mysql
中的联合索引遵循最左匹配原则,比如说a,b,c这个联合索引,在查询时如果想用上索引,那就要带上a这个列:比如where a=1,b=1,c=1可以全部用上索引。
where a=1,c=1,只有a能用上索引,c不行
where b=1,c=1,用不上索引
where a>1,b=1,c=1,a可以用上,b,c用不上。注意这种情况下a是范围查询可以根据索引找到第一个大于1的记录,但是b和c只有当a的值确定时他们才按照索引的顺序排列,也就是说比如找到的记录是
a=2,b=1,c=1
a=2,b=2,c=1
a=2,b=2,c=2
a=2,b=3,c=2那这些记录可以用上索引,但是显然事情没有那么简单,如果数据是这样的
a=2,b=1,c=2
a=3,b=3,c=1
a=4,b=1,c=1
a=4,b=2,c=2这种情况下怎么用索引呢?我们想可以这样:把范围查询后的结果按照每一个a的值来划分,然后对每一个确定的a的值的对应记录用一次索引,那原先的sql语句就拆成了
where a=2,b=1,c=1
where a=3,b=1,c=1
where a=4,b=1,c=1这样查询效率并没有提升,也就失去了用索引的意义。所以这种情况下只有a能用上索引
不过当统计出a>1这个范围查询得到的记录中a的值仅有几个的情况下,Mysql的8.0.26之后提供了一种方法叫做Using Index for skip scan。就是上面说的将后续查询加上条件拆解,变成符合最左匹配原则的查询,最后再把结果拼接起来
https://www.mianshiya.com/bank/1860871861809897474/question/1780933295450648578#heading-4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构