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也可以实现类似的功能.

[[email protected] 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

[[email protected] 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调用

[[email protected] ~]# 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定的.

时间: 2024-08-24 23:28:46

MySQL的数据读取过程的相关文章

MYSQL 的数据读取方式

例子: create table T(X bit(8)); insert into T (X) values(b'11111111'); select X from T; 这个时候会发现这个X 是乱码的,不要当心真正的数据是已经存入了的.只是你的打开方式不对. 如果要用二进制的方式来看的话可以这样 select bin(X) from T; 同理:oct(X) 以八进制的方式来看          hex(X)以16进制的方式来看   X+0 以10进制的方式来看

TableInputFormat分片及分片数据读取源码级分析

我们在MapReduce中TextInputFormat分片和读取分片数据源码级分析 这篇中以TextInputFormat为例讲解了InputFormat的分片过程以及RecordReader读取分片数据的过程.接下来咱们分析TableInputFormat的分片信息和数据读取过程. TableInputFormat这是专门处理基于HBase的MapReduce的输入数据的格式类.我们可以看看继承结构:(1)public class TableInputFormat extends Table

java 读取mysql中数据 并取出

public static String url = null; public static String username = null; public static String password = null; public static Connection conn; public static Statement stmt; public static ResultSet rs; public static String fileName = null; public static

Apache Spark技术实战之7 -- CassandraRDD高并发数据读取实现剖析

未经本人同意,严禁转载,徽沪一郎. 概要 本文就 spark-cassandra-connector 的一些实现细节进行探讨,主要集中于如何快速将大量的数据从cassandra 中读取到本地内存或磁盘. 数据分区 存储在 Cassandra 中数据的一般都会比较多,记录数在千万级别或上亿级别是常见的事.如何将这些表中的内容快速加载到本地内存就是一个非常现实的问题.解决这一挑战的思路从大的方面来说是比较简单的,那就是将整张表中的内容分成不同的区域,然后分区加载,不同的分区可以在不同的线程或进程中加

CentOS 6.5 MySQL/MariaDB数据备份与恢复备份详解

MySQL/MariaDB数据备份与恢复备份 数据对我们来说再重要不过了,那我们如何做到对数据尽可能的安全呢,当我们的数据丢失了那又该怎么做呢,所以说数据备份对我们的数据安全性来说太重要了. 数据对我们来说再熟悉不过了,也最平常不过了,我们每天都在接触各色各样的数据,数据记录了我们平常相关的业务信息,所以数据对于我们来说是很重要的,这么重要的数据如果我们的数据丢失了那我们是不是相关的业务都没法进行了呢,这应该是个很麻烦的问题,那我们怎么保护我们的数据的安全呢,这就要用到我们的数据备份了. 如何执

MySQL 大数据量快速插入方法和语句优化

MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开表的初始开销,每个并发运行的查询打开. 表的大小以logN (B树)的速度减慢索引的插入. 加快插入的一些方法 如果同时从同一个客户端插入很多行,使用含多个VA

mysql几种读取文件方法的使用

mysql数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以进行对文件进行读写(但前提是权限足够) 总结下mysql在不同版本读取文件方法大致有这3个: 1.load_file() 2.load data infile() 3.system cat load_file()和load data infile读取文件的方法为:新建一个表,读取文件为字符串形式插入表中,然后读出表中数据. 但是通常情况下有两个前提: 1.在拥有file权限的前提下 2.secure_file_pri

java+Mysql大数据的一些优化技巧

众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,POI开始意

Mysql丢数据及主从数据不一致的场景

Mysql丢数据及主从数据不一致的场景 随着对MySQL的学习,发现了MySQL的很多问题,最重要的就是丢数据的问题.对于丢数据问题,我们应该了解丢数据的场景,这样在以后的学习中多考虑如何去避免及解决这些问题. 1.MySQL数据库层丢数据场景   本节我们主要介绍一下在存储引擎层上是如何会丢数据的. 1.1.InnoDB丢数据   InnoDB支持事务,同Oracle类似,事务提交需要写redo.undo.采用日志先行的策略,将数据的变更在内存中完成,并且将事务记录成redo,顺序的写入red