MySQL的数据读取过程
本文来自:http://blog.chinaunix.net/uid-20785090-id-4759476.html
对于build-in的innodb的架构,每次当发布IO请求时,究竟是
mysql服务的线程完成还是由innodb_read_io_threads来完成的呢?和朋友讨论
这个问题,没有结论,通过跟踪发现,是由mysql服务的线程完成的.
MYSQL:5.5.33
OS:RHEL 5.8
连接到mysql,关闭自动提交,然后发布一条sql
mysql> set autocommit=0;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t2 values(34);
Query OK, 1 row affected (0.04 sec)
查看当前事务的线程handle
mysql> show engine innodb status\G;
...............................
---TRANSACTION 57498, ACTIVE 3 sec
1 lock struct(s), heap size 376, 0 row lock(s), undo log entries 1
MySQL thread id 12, OS thread handle 0x4d67e940, query id 332 localhost root cleaning up
TABLE LOCK table `db1`.`t2` trx id 57498 lock mode IX
----------------------------
END OF INNODB MONITOR OUTPUT
============================
可以看到当前的handle是 0x4d67e940,通过pstack找到mysql的进程号,然后查看线程
通过gdb也可以实现类似的功能.
[root@c12 zabbix]# ps -eaf | grep mysqld
root 2452 1 0 Jan09 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/c12.fb.com.pid
mysql 2734 2452 0 Jan09 ? 00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/mysql/plugin --user=mysql --log-error=/usr/local/mysql/data/c12.fb.com.err --pid-file=/usr/local/mysql/data/c12.fb.com.pid --socket=/tmp/mysql.socket
[root@c12 zabbix]# pstack 2734
.............................
Thread 2 (Thread 0x4d67e940 (LWP 26297)):
#0 0x00000036a1ccaf36 in poll () from /lib64/libc.so.6
#1 0x0000000000b612cf in vio_io_wait ()
#2 0x0000000000b613c3 in vio_socket_io_wait ()
#3 0x0000000000b61a18 in vio_read ()
#4 0x0000000000659213 in net_read_raw_loop(st_net*, unsigned long) ()
#5 0x0000000000659aab in net_read_packet(st_net*, unsigned long*) ()
#6 0x0000000000659d1c in my_net_read ()
#7 0x00000000006ea30d in do_command(THD*) ()
#8 0x00000000006b5d5f in do_handle_one_connection(THD*) ()
#9 0x00000000006b5e37 in handle_one_connection ()
#10 0x0000000000acde7a in pfs_spawn_thread ()
#11 0x00000036a280673d in start_thread () from /lib64/libpthread.so.0
#12 0x00000036a1cd3d1d in clone () from /lib64/libc.so.6
Thread 1 (Thread 0x2ab3670fcab0 (LWP 2734)):
#0 0x00000036a1ccaf36 in poll () from /lib64/libc.so.6
#1 0x000000000059b6ca in handle_connections_sockets() ()
#2 0x00000000005a3379 in mysqld_main(int, char**) ()
#3 0x00000036a1c1d994 in __libc_start_main () from /lib64/libc.so.6
#4 0x0000000000594319 in _start ()
对这个线程跟踪IO调用
[root@c12 ~]# strace -e trace=open,pread -p 26297
Process 26297 attached - interrupt to quit
发布一个读表的select
mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.02 sec)
.....................................................
open("./zabbix/users.ibd", O_RDWR) = 60
pread(60, "sj\304=\0\0\0\4\377\377\377\377\377\377\377\377\0\0\0\0\3\233\202\267E\277\0\0\0\0\0\0"..., 16384, 65536) = 16384
pread(60, "v\304i\227\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\3\233qz\0\5\0\0\0\0\0\0"..., 16384, 16384) = 16384
可以看到这线程的调用输出,先打开文件,然后使用pread去读取,刚好每次的大小是innodb_page_size定的.
MySQL的数据读取过程的更多相关文章
- 通过mapreduce把mysql的数据读取到hdfs
前面讲过了怎么通过mapreduce把mysql的一张表的数据放到另外一张表中,这次讲的是把mysql的数据读取到hdfs里面去 具体怎么搭建环境我这里就不多说了.参考 通过mapreduce把mys ...
- 【Netty源码分析】数据读取过程
首先客户端连接到服务端时服务端会开启一个线程,不断的监听客户端的操作.
- Mysql遍历大表(Mysql大量数据读取内存溢出的解决方法)
mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很大的表,则可能把内存撑爆. 一种办法是:用limit,offset,但这样你会发现取数据的越来越慢,原因是设置了of ...
- 【MySQL】详细说下MySQL删除数据的过程是什么样的?
drop table 这里先介绍一下[InnoDB]存储表空间概念: Innodb存储引擎,可将所有的数据库数据存放于[ibdata1]的共享表空间:也可以将每张表存放于独立的.idb文件的独立表空间 ...
- MYSQL 的数据读取方式
例子: create table T(X bit(8)); insert into T (X) values(b'11111111'); select X from T; 这个时候会发现这个X 是乱码 ...
- TableInputFormat分片及分片数据读取源码级分析
我们在MapReduce中TextInputFormat分片和读取分片数据源码级分析 这篇中以TextInputFormat为例讲解了InputFormat的分片过程以及RecordReader读取分 ...
- Tensorflow学习-数据读取
Tensorflow数据读取方式主要包括以下三种 Preloaded data:预加载数据 Feeding: 通过Python代码读取或者产生数据,然后给后端 Reading from file: 通 ...
- hbase实践之数据读取详解
hbase基本存储组织结构与数据读取组织结构对比 Segment是Hbase2.0的概念,MemStore由一个可写的Segment,以及一个或多个不可写的Segments构成.故hbase 1.*版 ...
- pandas读取MySql/SqlServer数据 (转)
在 Anacondas环境中,conda install pymssql ,一直报包冲突,所以采用先在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#nump ...
随机推荐
- 多线程,线程池与BeginInvoke()
在WinForm中,很多情况下需要用到多线程,下面我来简单介绍一下多线程的基本用法. 1.线程. (1)线程的初始化 Thread t = new Thread(new ThreadStart( ...
- Python扫描器-常用库-Request
1.常用库-Request 1.1. 介绍 #安装:pip3 install requests #各种请求方式:常用的就是requests.get()和requests.post() >> ...
- maven执行过程中抛出的各类异常信息
价值 各类异常信息分类 举例 maven源代码的模块maven-core里的各类*Exception命名的class包含里,maven执行过程中打印的各类异常日志内容 比如如下错误 错误信息分别来自( ...
- 【计算机视觉】Object Proposal之BING++
本文是对 BING 算法的升级,主要是在快的同时保持定位精度 两个 + 分别对应: edge-based recursive boxes as one "+", and MTSE ...
- 关于React的脚手架
Rewire你的应用 https://ant.design/docs/react/use-with-create-react-app-cn create-react-app (官方脚手架 简称cra) ...
- mysql 查询某一天数据
某个场景下需要查询某一天的数据,例如2017/9/27这一天所有的数据量,有以下几个方法. SELECT * FROM cms_book_statistics WHERE substring(Conv ...
- Asp.Net Core文件上传
文件上传功能在实际开发中经常使用,在 .Net Core中,文件上传接收类型不再使用 HttpPostedFile 或 HttpFileCollection来接收,而是使用 IFormFile 或 I ...
- 微信小程序的网络重试机制
最近在开发微信小程序, 在测试时, 总能碰到一些诸如网络被打断啊之类的问题. 小程序是一款实时互动的小程序, 基于一系列原因, 没有使用Socket, 而是使用的是长链接. 所以对这类问题不能大意啊, ...
- SQLSever--基础学习--创建登录用户&创建数据库用户&分配权限
如题,本文简记一下SQL Sever里面登录用户(login)的创建,数据库用户(DBUser)的创建,以及给数据库用户分配权限(Grant). 数据库有三层保护机制: 第一层:登录用户以及登录密码的 ...
- ${__setProperty(row,rowNum)};不能在import XXX后面使用;
如下 ${__javaScript只能用一次调用 excel.CWResultFile.CWOutputFile.wOutputFile("/Users/iot/1.xls", & ...