Mysql随记
@
mysql使用的是“边读边发”模式。
- 从引擎读取数据到Server
- 将数据放入
net_buffer
中,达到net_buffer_length
后写入socket send client
发送给Client - 此时客户端如果接受慢,会影响到查询效率
使用show processlist
可以看见client的状态
state=Sending to Client
标识正在写入net_buffer
state=Sending data
只标识正在执行
Buffer Pool
-
页热点数据如何存储?
buffer pool
使用的是LRU算法。但不是普通的LRU算法,因为会存在冷数据站满脸表导致缓存失效的问题。
bufer pool
使用的是改良后的LRU算法,具体如下:- 使用5/8称为young区域
- 使用3/8称为old区域
使用指针
lru_old
标识old区域开始的位置
当需要产生新的Page时,淘汰old尾部Page,新Page插入lru_old
位置
innodb_old_blocks_time
后页还在移动到young头部,否则不变
保证了大表扫描期间,热数据可用。
Join
表链接,使用一张表的字段作为基准查询另一张表后组合返回
使用时应该注意小表驱动大表:where条件后数据较少的表称为小表
它的大概查询步骤是:(有表T,T1)
- 根据条件查询出表T,根据
on
语句后条件在表T1中查询到数据后返回-
index Nested-Loop Join
:on
语句后T1表索引命中,直接逐行取查询索引树返回- 为了用上MRR(随机读写转为顺序读写)加快join效率,将T表数据查处后在
join_buffer
中案Id排好序再根据索引去T1表取数据拼接结果集(BKA)。 - 开启:
set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'
- 为了用上MRR(随机读写转为顺序读写)加快join效率,将T表数据查处后在
-
block Nested-Loop Join
:on
语句后T1表没有索引
- 取出T表数据
- 根据
on
后条件查询T1数据放入Join Buffer
中,如果Join Buffer
到达join_buffer_size
后T1表未遍历结束,组合T和T1的结果集后清空Join buffer
重新开始。
如何针对BNL查询优化:
使用临时表创建带索引的列,就可以转为BKA加快查询效率了。
-