symbolic links
fork
symbolic links
fork
wsl-ubuntun.vbs - 开机自启
1 | Set ws = CreateObject("Wscript.Shell") |
/etc/init.wsl
1 |
|
1 | sudo chmod a+w "R" |
Thread 中部分方法:
1 | public static void joinTest() { |
输出: 0,1,2,3,4,5,6,7,8,9
1 | public static void daemonTest() { |
1 | public static void exceptionHandlerTest() { |
多个 Thread 使用一个 Runnable 对象与每个 Thread 使用独立的 Runnable 对象的区别?
事务的隔离级别
RowBounds, 所以在这方面,不同的驱动能够取得不同级别的高效率。为了取得最佳的表现,请使用结果集的 SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 的类型(换句话说:不用 FORWARD_ONLY)。
很多时候你不用调用 rollback(),因为 MyBatis 会在你没有调用 commit 时替你完成回滚操作。然而,如果你需要在支持多提交和回滚的 session 中获得更多细粒度控制,你可以使用回滚操作来达到目的。
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。
每当一个新 session 被创建,MyBatis 就会创建一个与之相关联的本地缓存。任何在 session 执行过的查询语句本身都会被保存在本地缓存中,那么,相同的查询语句和相同的参数所产生的更改就不会二度影响数据库了。本地缓存会被增删改、提交事务、关闭事务以及关闭 session 所清空。
<association>
相似,而 many 属性是对集合而言的,和<collection>
resultType |
从这条语句中返回的期望类型的类的完全限定名或别名。 ==注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身==。可以使用 resultType 或 resultMap,但不能同时使用。 |
@Param 参数 N/A 如果你的映射方法的形参有多个,这个注解使用在映射方法的参数上就能为它们取自定义名字。若不给出自定义名字,多参数(不包括 RowBounds 参数)则先以 “param” 作前缀,再加上它们的参数位置作为参数别名。例如 #{param1}, #{param2},这个是默认值。如果注解是 @Param(“person”),那么参数就会被命名为 #{person}。
需要试验一下,映射方法有多个参数
1 | configuration.addMapper(BlogMapper.class); |
在次级索引上使用范围扫描(range scan)读取行时,当表很大且没有存储再存储引擎的缓存中时,就可能会导致对基础表的的许多磁盘的随机访问。 Mysql 试图通过 Multi-Range Read (MRR) 优化来减少范围扫描时的随机磁盘访问
优化的动机就是减少随机磁盘访问,实现对基表的更多的顺序扫描
MRR 不支持虚拟列上的次级索引.
场景 A
InnoDB, MyISAM 表的索引范围扫描或者等值连接操作 (equi-join operations)
场景 B
MRR 可以用于 NDB 表,用于多范围索引扫描,或者用于通过属性执行等值连接。
执行计划的 Extra
列为 Using MRR
InnoDB, MyISAM 如果需要进行全表扫描时, 不会使用 MRR 优化. 例如: 如果仅仅基于索引对中的信息就可以获取查询结构, 即 覆盖索引, MRR 不会提供任何优化.
optimizer_switch
系统变量提供了使用 MRR 优化的开关, mrr
标志表示 MRR 是否已开启 (on), 默认开启, mrr_cost_based
标志表示控制查询优化器是否尝试基于性能的选择, 使用或不适用 MRR, 默认开启 (on). 如果希望尽可能的使用 MRR , 将其置为 off
1 | SELECT @@optimizer_switch; |
read_rnd_buffer_size
系统变量表明可以为缓冲区分配的内存字节大小.
1 | -- 默认 262144B = 256KB |
1 | show create table user_info; |
使用 in
的范围查询
1 | explain select * from user_info where uid in ('204-42-7061','735-14-7777','321-09-5846'); |
1 | -- in 的条件查询有 400 多个,后面的省略了 |
MySQL 中可以使用 Batched Key Access (BKA)
连接算法来同时使用索引来访问被连接的表, 同样也使用一个连接缓冲区. BKA 算法支持内连接, 外连接, 以及半连接 (semijoin operations), 包括前内外连接. BKA 算法由于更高效的表扫描, 可以提升连接的性能. 同时, Block Nested-Loop(BNL)
连接算法也可以被扩展应用与的外连接等操作.
Join Buffer Management for Block Nested-Loop and Batched Key Access Algorithms
Block Nested-Loop Algorithm for Outer Joins and Semijoins
Batched Key Access (BKA) 连接算法用于连接表, 当第二个连接操作数( the second join operand - 被驱动表) 表生成的行可以使用索引访问时, 可以使用应用 BKA 算法.
使用 BKA 时, join_buffer_size
定义的时每次发给存储引擎的批量 keys 的大小
optimizer_switch
系统变量的 batched_key_access
需要置为 on
, BKA 同时使用 MRR, mrr
也需要置为 on
. 并且由于目前对于使用 MRR 所进行的优化效果过于悲观, 需要将 mrr_cost_based
置为 off
1 | SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'; |
执行计划的 Extra
列为 Using join buffer (Batched Key Access)
, 同时, 连接类型 type
是 ref
或者 eq_ref
开启 BKA
1 | SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'; |
1 | show create table user_score; |
连接查询, 并且被驱动表的连接类型是 ref
, eq_ref
1 | explain select * from user_score a left join user_info b on a.uid = b.uid; |
关掉 BKA, 还原默认设置
1 | SET optimizer_switch='mrr=on,mrr_cost_based=on,batched_key_access=off'; |
*被驱动表的连接类型不是 ref
, eq_ref
*
1 | explain select * from user_info a left join user_score b on a.uid = b.uid; |