2025.2.17 学习

2025.2.17 学习

八股

1.ThreadLocal

在某些不需要多线程共享变量的场景下,我们需要为每一个线程提供一个独立的变量来供其使用,比获取当前登录用户的信息,建立与数据库的连接,这两个场景都不存在多线程竞争同一变量的情况,而是需要为每个线程创建一个独立的变量。这样我们就可以用ThreadLocal

image-20250217103949420

concurrentHashMap线程安全,锁特定链表/红黑树

HashMap线程不安全

HashTable线程安全,锁整个表,粒度大速度慢,很早之前的类了现在已经很少用

jdk 1.7和1.8版本concurrentHashMap的变化:1.7根据段segment去上锁,每个哈希表被分成最高16个段,扩容和上锁操作都是在段的层面上去进行的。1.8舍去了段,改为以node节点的粒度来上锁。同时扩容上也有改变:

image-20250217120005951

最左匹配原则

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

posted @   vast_joy  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示