日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MySQL基礎(chǔ)架構(gòu):SQL查詢語句執(zhí)行過程

MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),采用的是分層結(jié)構(gòu),本文中將簡單介紹MySQL數(shù)據(jù)庫的內(nèi)部架構(gòu)。

創(chuàng)新互聯(lián)建站2013年至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元那曲做網(wǎng)站,已為上家服務(wù),為那曲各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

MySQL是一個C/S系統(tǒng),MySQL服務(wù)器是服務(wù)器,連接到MySQL服務(wù)器的應用程序是客戶端。MySQL體系結(jié)構(gòu)主要包含三層:

  • 客戶端層
  • 服務(wù)器層
  • 存儲層

客戶端層

客戶端層主要負責連接數(shù)據(jù)庫,連接建立后,客戶端可以看到一個線程??蛻舳藢酉蚍?wù)端發(fā)送請求指令,并在屏幕上顯示輸出。

比如連接MySQL服務(wù)器:mysql -u root -p

查詢端口號3306:

$ netstat -ano | findstr 3306
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 18456
TCP 0.0.0.0:33060 0.0.0.0:0 LISTENING 18456
TCP [::]:3306 [::]:0 LISTENING 18456
TCP [::]:33060 [::]:0 LISTENING 18456
TCP [::1]:3306 [::1]:64636 ESTABLISHED 18456
TCP [::1]:64636 [::1]:3306 ESTABLISHED 148

$ tasklist | findstr 18456
mysqld.exe 18456 Services 0 374,900 K

$ tasklist | findstr 148
mysql.exe 148 Console 1 10,840 K

可以看到啟動了一個PID為148,名字為mysql.exe的進程。

另外開啟一個連接會再啟動一個mysql進程:

$ netstat -ano | findstr 3306
TCP [::1]:3306 [::1]:64636 ESTABLISHED 18456
TCP [::1]:3306 [::1]:64909 ESTABLISHED 18456
TCP [::1]:64636 [::1]:3306 ESTABLISHED 148
TCP [::1]:64909 [::1]:3306 ESTABLISHED 1272

服務(wù)器層

MySQL Server 層負責MySQL的所有邏輯功能,包括連接器、數(shù)據(jù)緩存、緩存查詢、分析器、優(yōu)化器、執(zhí)行器等核心功能,以及所有的內(nèi)置函數(shù)(如日期、時間、數(shù)學和加密函數(shù)等),所有跨存儲引擎的功能都在這一層實現(xiàn),比如存儲過程、觸發(fā)器、視圖等。

連接器

客戶端連接服務(wù)器時會首先經(jīng)過連接器,連接器負責跟客戶端建立連接、維持和管理連接、認證、權(quán)限管理等。

執(zhí)行連接命令 mysql -u root -p,輸入密碼,密碼認證通過,然后進行權(quán)限認證,這樣用戶與MySQL服務(wù)器就成功的建立了連接。

可以使用 show processlist 命令中獲取建立的連接:

mysql> show processlist;
+----+-----------------+-----------------+------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+------+---------+------+------------------------+------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 6007 | Waiting on empty queue | NULL |
| 11 | root | localhost:64636 | NULL | Query | 0 | starting | show processlist |
| 12 | root | localhost:64909 | NULL | Sleep | 5182 | | NULL |
+----+-----------------+-----------------+------+---------+------+------------------------+------------------+
3 rows in set (0.00 sec)

連接建立成功后,如果不進行進一步操作,不會馬上斷開,此連接進入空閑狀態(tài),Sleep 表示一個空閑連接。這個空閑連接也不會一直存在,一般默認是 8 小時,可以通過設(shè)置參數(shù) wait_timeout 來控制。

mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set, 1 warning (0.05 sec)

mysql> set global wait_timeout=28800;

查詢緩存

執(zhí)行查詢語句前,MySQL會先查找查詢緩存,如果當前查詢存在緩存(語句及結(jié)果會以 key-value 對的形式保存)中,那么結(jié)果就會直接返回到客戶端。

如果語句不在查詢緩存中,就會繼續(xù)后面的執(zhí)行階段。執(zhí)行完成后,執(zhí)行結(jié)果會被存入查詢緩存中。

需要注意的是,對于頻繁更新的數(shù)據(jù)表不建議開啟查詢緩存。只要有對一個表的更新,這個表上所有的查詢緩存都會被清空,這對于并發(fā)度大的服務(wù)來說會導致額外的開銷,反而降低效率 。

MySQL 8.0 版本已經(jīng)將查詢緩存功能刪除了。

mysql> show variables like '%query_cache%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | NO |
+------------------+-------+
1 row in set, 1 warning (0.00 sec)

分析器

?分析器是對 SQL 語句進行解析,首先做“詞法分析”,識別出SQL 語句的字符串分別是什么,代表什么。比如查詢語句 select * from student where id=1;,識別出關(guān)鍵字select表示一個查詢語句,名為student的表,把字符串“id”識別成表字段id。如果不存在id字段,則會在這個階段報錯。

完成詞法分析后,開始進行“語法分析”,根據(jù)語法規(guī)則,判斷輸入的 SQL 語句是否滿足 MySQL 語法。?

優(yōu)化器

經(jīng)過分析器后,還要使用優(yōu)化器進行優(yōu)化。包括了多種優(yōu)化技術(shù),比如確定掃描表的順序、選擇索引、確定表連接順序等。

執(zhí)行器

SQL語句經(jīng)過了詞法分析、語法分析和優(yōu)化之后,正式進入執(zhí)行器階段,開始執(zhí)行語句。

執(zhí)行之前,還會進行權(quán)限驗證,查詢是否有相應權(quán)限。如果有權(quán)限,執(zhí)行器會調(diào)用表的引擎提供的接口執(zhí)行語句,執(zhí)行器會將所有滿足條件的行組成的記錄集作為結(jié)果集返回給客戶端。

存儲層

存儲引擎層負責數(shù)據(jù)的存儲和提取。其架構(gòu)模式是插件式的,支持 InnoDB、MyISAM、Memory 等多個存儲引擎,不同的存儲引擎共用一個 Server 層。

使用命令 show engines; 查看當前MySQL服務(wù)器支持的引擎:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

默認存儲引擎為InnoDB,可以在建表的時候指定存儲引擎:

create table student(
id int not null auto_increment primary key COMMENT 'ID',
name varchar(10) not null COMMENT '姓名',
sex char(10) not null COMMENT '性別',
age tinyint(100) not null COMMENT '年齡',
dept char(4) not null COMMENT '專業(yè)') ENGINE=InnoDB
DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
comment = '學生';

在MySQL 5.5.5 之前的版本默認使用MyISAM 存儲引擎,MySQL 5.5.5 版本開始使用InnoDB作為默認存儲引擎。


網(wǎng)站名稱:MySQL基礎(chǔ)架構(gòu):SQL查詢語句執(zhí)行過程
標題鏈接:http://www.dlmjj.cn/article/dhhhhge.html