1.mysql进行全表扫描时,把扫描结果保存在客户端,指令如下:
mysql -h$host -P$port -u$user -p$pwd -e
"select * from db1.t" > $target_file
2.mysql查询流程为:
获取一行数据,写到 net_buffer 中,这块内存的大小是由参数net_buffer_length定义,默认16k,重复获取行,直到该内存写满,然后调用网络发送出去,然后清空net-buffer。重复此操作,直至数据完全读取。若发送函数返回EAGAIN或WSAEWOULDBLOCK,就表示本地网络栈(socket send buffer)写满了,进入等待。直到网络栈重新可写,再继续发送。
3.mysql采取的是边读边发,若客户端来不及处理,会导致mysql发不出去,事务执行卡住。查看mysql服务端的进程情况:show processlist
3.若客户端使用–quick参数,会使用mysql_use_result方法:读一行处理一行。该方法适合处理数据量大的场景。若数据量小,可使用mysql_store_result,将结果存在本地内存。
4.查询语句状态是“Sending data”,并不一定是指“正在发送数据”,而可能是处于执行器过程中的任意阶段
5.InnoDB是mysql的查询引擎,它有一个内存机制,保存更新的结果,再配合redo log,避免随机写盘。内存的数据页是在Buffer Pool (简称为BP)管理,在WAL里BP起加速更新的作用。
- 由于WAL,当事务提交时,磁盘上的数据页是旧的,若这时马上有个查询来读该数据页,是不是要马上把redo log应用到数据页?
不需要。因为此时,内存数据页的结果是最新的,直接读内存页即可。这时查询无需读磁盘,直接从内存取结果,速度很快。所以,Buffer Pool能加速查询。 - InnoDB Buffer Pool的大小是由参数 innodb_buffer_pool_size确定,一般建议设置成可用物理内存的60%~80%。
- 而BP对查询的加速效果,依赖于一个重要的指标,即:内存命中率。
可以在show engine innodb status结果中,查看一个系统当前的BP命中率。一般情况下,一个稳定服务的线上系统,要保证响应时间符合要求的话,内存命中率要在99%以上。