成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

MYSQLsql執(zhí)行過程的一些跟蹤分析(一)

    與oracle或其他的數(shù)據(jù)庫都差不多,一條sql的執(zhí)行主要還是要經(jīng)歷了解析、優(yōu)化、執(zhí)行這幾個過程,稍微具體下總結(jié),MySQL的主要過程如下:
客戶端發(fā)起連接-----連接器,主要分配線程,驗(yàn)證權(quán)限----分析器,對sql語句語法進(jìn)行分析-----優(yōu)化器,生成準(zhǔn)確的執(zhí)行計劃-----執(zhí)行器,執(zhí)行語句,發(fā)起讀寫數(shù)據(jù),返回結(jié)果--之后對數(shù)據(jù)讀寫是io線程與存儲引擎的交互
在客戶端連接部分,涉及到TCP三次握手過程,我已在《MYSQL 連接登錄過程分析》中嘗試進(jìn)行分析。 http://blog.itpub.net/29863023/viewspace-2216731/
嘗試用strace追蹤mysqld進(jìn)程,觀察發(fā)起一個連接去執(zhí)行sql時的情況:
[root@cwdtest1 ~]# strace -f -F -ff -o mysqld-strace -s 1024 -p 62509
strace: Process 62509 attached with 32 threads
....
strace: Process 33059 attached
[root@cwdtest1 /]# mysql -uroot -pcwdroot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 24
Server version: 5.7.23-23-log Source distribution
Copyright (c) 2009-2018 Percona LLC and/or its affiliates
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from cwdtest.test;
+---------+----------+
| col1    | col2     |
+---------+----------+
|         | aaaaaaaa |
| ccccccc | NULL     |
+---------+----------+
2 rows in set (0.00 sec)
mysql> exit
Bye

從performance_schema.threads中可以看到新增的54號前臺線程thread/sql/one_connection,其os 線程id是33059

為昌江黎族等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及昌江黎族網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站制作、昌江黎族網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

*************************** 31. row ***************************
          THREAD_ID: 54
               NAME: thread/sql/one_connection
               TYPE: FOREGROUND
     PROCESSLIST_ID: 28
   PROCESSLIST_USER: root
   PROCESSLIST_HOST: localhost
     PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Sleep
   PROCESSLIST_TIME: 10
  PROCESSLIST_STATE: NULL
   PROCESSLIST_INFO: NULL
   PARENT_THREAD_ID: 1
               ROLE: NULL
       INSTRUMENTED: YES
            HISTORY: YES
    CONNECTION_TYPE: Socket
       THREAD_OS_ID: 33059 《======
31 rows in set (0.00 sec)
分析strace的過程信息:
獲取線程id33059,之后設(shè)置 setsockopt狀態(tài)。這里看到open  /dev/urandom,這是獲取一個隨機(jī)編號
set_robust_list(0x7f9aa60ea9e0, 24) = 0
gettid() = 33059
setsockopt(67, SOL_TCP, TCP_NODELAY, [1], 4) = -1 EOPNOTSUPP (Operation not supported)
setsockopt(67, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
open("/dev/urandom", O_RDONLY) = 68
read(68, "'\275|\274\277\200Uw\2205\3)M\4E\364C\372\210\222\235\345\33I\216\252\206M\336C;\372", 32) = 32
close(68) = 0

之后是密碼驗(yàn)證,以及一些版本消息等

sendto(67, "Q\0\0\0\n5.7.23-23-log\0\34\0\0\0{PR&1|0 \0\377\367!\2\0\377\201\25\0\0\0\0\0\0\0\0\0\0\4\26:5.h\34U\"G%a\0mysql_native_password\0", 85, MSG_DONTWAIT, NULL, 0) = 85
recvfrom(67, "\272\0\0\1", 4, MSG_DONTWAIT, NULL, NULL) = 4
recvfrom(67, "\205\246\377\1\0\0\0\1!\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0root\0\24\v\10A\216\"\344i\31'\331UMa\"\356\4\3640!\331mysql_native_password\0i\3_os\5Linux\f_client_name\10libmysql\4_pid\00533058\17_client_version\t5.7.23-23\t_platform\6x86_64\fprogram_name\5mysql", 186, MSG_DONTWAIT, NULL, NULL) = 186
sendto(67, "\7\0\0\2\0\0\0\2\0\0\0", 11, MSG_DONTWAIT, NULL, 0) = 11
recvfrom(67, "!\0\0\0", 4, MSG_DONTWAIT, NULL, NULL) = 4
recvfrom(67, "\3select @@version_comment limit 1", 33, MSG_DONTWAIT, NULL, NULL) = 33
sendto(67, "\1\0\0\1\1'\0\0\2\3def\0\0\0\21@@version_comment\0\f!\0009\0\0\0\375\0\0\37\0\0\24\0\0\3\23Source distribution\7\0\0\4\376\0\0\2\0\0\0", 83, MSG_DONTWAIT, NULL, 0) = 83
recvfrom(67, 0x7f9a9000a730, 4, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=67, events=POLLIN|POLLPRI}], 1, 28800000) = 1 ([{fd=67, revents=POLLIN}])

接受到shelect 的查詢語句,我們可以看到 會stat ./cwdtest/test.frm 這個文件,這里是 獲取文件信息,并在去訪問./cwdtest/test.TRG,發(fā)現(xiàn)提示No such file or directory。

recvfrom(67, "\33\0\0\0", 4, MSG_DONTWAIT, NULL, NULL) = 4
recvfrom(67, "\3select * from cwdtest.test", 27, MSG_DONTWAIT, NULL, NULL) = 27
stat("./cwdtest/test.frm", {st_mode=S_IFREG|0640, st_size=8590, ...}) = 0
access("./cwdtest/test.TRG", F_OK) = -1 ENOENT (No such file or directory)
sendto(67, "\1\0\0\1\2-\0\0\2\3def\7cwdtest\4test\4test\4col1\4col1\f!\0\36\0\0\0\375\1\20\0\0\0-\0\0\3\3def\7cwdtest\4test\4test\4col2\4col2\f!\0\36\0\0\0\375\0\0\0\0\0\n\0\0\4\0\10aaaaaaaa\t\0\0\5\7ccccccc\373\7\0\0\6\376\0\0\"\0\0\0", 141, MSG_DONTWAIT, NULL, 0) = 141
recvfrom(67, 0x7f9a9000a730, 4, MSG_DONTWAIT, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=67, events=POLLIN|POLLPRI}], 1, 28800000) = 1 ([{fd=67, revents=POLLIN|POLLHUP}])
recvfrom(67, "\1\0\0\0", 4, MSG_DONTWAIT, NULL, NULL) = 4
recvfrom(67, "\1", 1, MSG_DONTWAIT, NULL, NULL) = 1
shutdown(67, SHUT_RDWR) = 0
close(67) = 0
futex(0x1dca184, FUTEX_WAIT_PRIVATE, 46, NULL <detached ...>
(END)
來看看./cwdtest/test.frm  和 ./cwdtest/test.TRG兩個文件:
frm是MySQL的表結(jié)構(gòu)定義文件,通過hexdump可以查看其中16進(jìn)制數(shù)據(jù)
[root@cwdtest1 cwdtest]# hexdump -C -v test.frm
00002130  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00002140  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 00  |               .|
00002150  04 00 05 63 6f 6c 31 00  05 00 05 63 6f 6c 32 00  |...col1....col2.|
00002160  04 05 1e 1e 00 02 00 00  00 40 00 00 00 0f 21 00  |.........@....!.|
00002170  00 05 05 1e 1e 00 21 00  00 00 80 00 00 00 0f 21  |......!........!|
00002180  00 00 ff 63 6f 6c 31 ff  63 6f 6c 32 ff 00        |...col1.col2..|
以上列信息整理可得:
04 05 1e 1e 00 02 00 00 00 40 00 00 00 0f 21 00 00 --- 字段col1
05 05 1e 1e 00 21 00 00 00 80 00 00 00 0f 21 00 00-----字段col2
以col1字段為例:
其中04代表 列序號(初始列序號為4),
1e 表示字段長度,1e轉(zhuǎn)化成十進(jìn)制是30,表中是字是 varchar( 10 ),字符集是utf8占3bit,所以長度是10*3=30.
40表示不可為空,(DEFAULT NULL 80,NOT NULL 40,DEFAULT 'VALUE' 00)
0f表示字段類型是varhcar    
21表示字符集是utf8
表創(chuàng)建語句:
| test | CREATE TABLE `test` (
  `col1` varchar(10) NOT NULL,
  `col2` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
TRG文件是mysql中記錄觸發(fā)器的定義,很明顯這里test表并沒有創(chuàng)建觸發(fā)器。
sendto(67, "\1\0\0\1\2-\0\0\2\3def\7cwdtest\4test\4test\4col1\4col1\f!\0\36\0\0\0\375\1\20\0\0\0-\0\0\3\3def\7cwdtest\4test\4test\4col2\4col2\f!\0\36\0\0\0\375\0\0\0\0\0\n\0\0\4\0\10aaaaaaaa\t\0\0\5\7ccccccc\373\7\0\0\6\376\0\0\"\0\0\0", 141, MSG_DONTWAIT, NULL, 0) = 141
之后便是調(diào)用sendto函數(shù),往客戶端發(fā)送結(jié)果。
當(dāng)退出時便是關(guān)閉。
shutdown(67, SHUT_RDWR) = 0
close(67) = 0
在以上的trace日志里每個函數(shù)操作的對象基本都是67,67則是文件描述符,而這里對應(yīng)的是socket。
[root@cwdtest1 fd]# ls -rtl 672
lrwx------ 1 root root 64 Jan 19 11:19 67 -> socket:[16206507]

本文題目:MYSQLsql執(zhí)行過程的一些跟蹤分析(一)
文章URL:http://jinyejixie.com/article34/ggiise.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、企業(yè)建站品牌網(wǎng)站建設(shè)、微信公眾號、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
姚安县| 体育| 峡江县| 秦皇岛市| 林周县| 板桥市| 翁源县| 浦江县| 家居| 青川县| 辽源市| 德令哈市| 竹山县| 盐源县| 临夏市| 扎赉特旗| 云梦县| 广水市| 调兵山市| 井研县| 灵山县| 长宁县| 大余县| 丰宁| 陈巴尔虎旗| 柳江县| 邮箱| 永登县| 宜都市| 科技| 曲水县| 浠水县| 东乌珠穆沁旗| 郴州市| 罗甸县| 衡山县| 吕梁市| 建始县| 巫山县| 蒲江县| 彭水|