色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一條SQL查詢語句是怎么去執行的?(上)

jf_78858299 ? 來源:蟬沐風的碼場 ? 作者:蟬沐風 ? 2023-03-03 09:58 ? 次閱讀

MySQL是典型的C/S架構(客戶端/服務器架構),客戶端進程向服務端進程發送一段文本(MySQL指令),服務器進程進行語句處理然后返回執行結果。

問題來了。服務器進程對客戶端發送的請求究竟做了什么處理呢?本文以查詢請求為例,講解MySQL服務器進程的處理流程。

如下圖所示,服務器進程在處理客戶端請求的時候,大致需要進行3個步驟:

  • 處理連接
  • 解析與優化
  • 存儲引擎

接下來我們來詳細了解一下這3步具體都做了什么。圖片

1. 處理連接

客戶端向服務器發送請求并最終收到響應,本質上是一個進程間通信的過程。

MySQL有專門用于處理連接的模塊——連接器

1.1 客戶端和服務端的通信方式

1.1.1 TCP/IP協議

TCP/IP協議是MySQL客戶端和服務器最常用的通信方式。

我們平時所說的MySQL服務器默認監聽的端口3306,這句話的前提是客戶端進程和服務器進程使用的是TCP/IP協議進行通信。

我們在使用mysql命令啟動客戶端程序時,只要在-h參數后跟隨IP地址作為服務器進程所在的主機地址,那么通訊方式便是TCP/IP協議。

如果客戶端進程和服務器進程位于同一臺主機,且要使用TCP/IP協議進行通信,則IP地址需要指定為127.0.0.1,而不能使用localhost

1.1.2 UNIX域套接字

如果客戶端進程和服務器進程都位于類UNIX操作系統(MacOS、Centos、Ubuntu等)的主機之上,并且在啟動客戶端程序時沒有指定主機名,或者指定的主機名為localhost,又或者指定了--protocol=socket的啟動參數,那么客戶端進程和服務器進程就會使用UNIX域套接字進行進程間通信。

MySQL服務器進程默認監聽的UNIX域套接字文件為/temp/mysql.sock,客戶端進程啟動時也默認會連接到這個UNIX域套接字文件之上。

如果不明白UNIX域套接字到底是什么也沒關系,只要知道這是進程之間的一種通訊方式就可以了,這里提及的主要目的是希望讀者知曉MySQL客戶端和進程通訊方式不止于TCP/IP協議

1.1.3 命名管道和共享內存

如果你的MySQL是安裝在Windows主機之上,客戶端和服務器進程可以使用命名管道和共享內存的方式進行通信。

不過使用這些通信方式需要在服務端和客戶端啟動時添加一些啟動參數。

  • 使用命名管道進行通信。需要在啟動服務器時添加--enable-named-pipe參數,同時在啟動客戶端進程時添加--pipe或者--protocol=pipe參數
  • 使用共享內存進行通信。需要在啟動服務器時添加--shared-memory參數,啟動成功后,共享內存便成為本地客戶端程序的默認連接方式;也可以在啟動客戶端進程的命令中加上--protocol=memory參數明確指定使用共享內存進行通信

如果不明白命名管道和共享內存到底是什么沒關系,只要知道這是進程之間的一種通訊方式就可以了,這里提及的主要目的是希望讀者知曉MySQL客戶端和進程通訊方式不止于TCP/IP協議

1.2 權限驗證

確認通信方式并且成功建立連接之后,連接器就要開始驗證你的身份了,使用的信息就是你的用戶名和密碼。

  • 如果用戶名或者密碼錯誤,客戶端連接會立即斷開
  • 如果用戶名密碼認證通過,連接器會到權限表里面查出當前登陸用戶擁有的權限。之后這個連接里面的權限判斷邏輯,都將依賴于此時讀到的權限。

1.3 查看MySQL連接

每當一個客戶端連接到服務端時,服務端進程都會創建一個單獨的線程來處理當前客戶端的交互操作。

那么如何查看MySQL當前所有的連接?

mysql> show global status like 'Thread%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |
| Threads_running   | 1     |
+-------------------+-------+

各字段含義如下表

字段 含義
Threads_cached 緩存中的線程連接數
Threads_connected 當前打開的連接數
Threads_created 為處理連接創建的線程數
Threads_running 非睡眠狀態的連接數,通常指并發連接數

建立連接之后,除非客戶端主動斷開連接,否則服務器會等待客戶端發送請求。但是線程的創建和保持是需要消耗服務器資源的,因此服務器會把長時間不活動的客戶端連接斷開。

有2個參數控制這個自動斷開連接的行為,每個參數都默認為28800秒,8小時。

-- 非交互式超時時間,如JDBC連接
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+

-- 交互式超時時間,如數據庫查看工具Navicat等
mysql> show global variables like 'interactive_timeout';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 28800 |
+---------------------+-------+

既然連接消耗資源,那是不是MySQL的最大連接數也有默認限制呢?沒錯!默認最大連接數為151。

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+

題外話:細心的讀者可能會發現MySQL某些查詢語句帶有global關鍵字,這個關鍵字有什么含義呢?

MySQL的系統變量有兩個作用范圍(不區分大小寫),分別是

  • GLOBAL(全局范圍):變量的設置影響服務器和所有客戶端
  • SESSION(會話范圍):變量的設置僅影響當前連接(會話)

但是并非每個參數都具有兩個作用范圍,比如允許同時連接到服務器的客戶端的數量max_connections就只有全局級別。

當沒有帶作用范圍關鍵字時,默認是SESSION級別,包括查詢和修改操作。

比如修改一個參數之后,在當前窗口生效了,但是在其他窗口卻沒有生效

show VARIABLES like 'autocommit';
set autocommit = on;

因此,如果只是臨時修改,請使用SESSION級別,如果需要當前設置在其他會話中生效,需要使用GLOBAL關鍵字。

到此為止,服務器進程已經和客戶端進程建立了連接,下一步將處理客戶端傳來的請求了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9206

    瀏覽量

    85562
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1362

    瀏覽量

    79119
  • MySQL
    +關注

    關注

    1

    文章

    816

    瀏覽量

    26613
  • 服務端
    +關注

    關注

    0

    文章

    66

    瀏覽量

    7020
收藏 人收藏

    評論

    相關推薦

    STM8L執行一條語句大概需要幾個時鐘周期?

    STM8L執行一條語句大概需要幾個時鐘周期
    發表于 05-06 06:16

    在Delphi中動態地使用SQL查詢語句

    在Delphi中動態地使用SQL查詢語句般的數據庫管理系統中,通常都需要應用SQL查詢
    發表于 05-10 11:10

    DSP執行一條語句的時間

    CPU配置成150M。高頻時鐘75M。 那么執行一條語句的時間是多少呢
    發表于 10-15 11:28

    select語句和update語句分別是怎么執行

    樣,但是具體的實現還是有區別的。 當然深入了解select和update的具體區別并不是只為了面試,當希望Mysql能夠高效的執行的時候,最好的辦法就是清楚的了解Mysql是如何執行查詢
    的頭像 發表于 11-03 09:41 ?3577次閱讀
    select<b class='flag-5'>語句</b>和update<b class='flag-5'>語句</b>分別是怎么<b class='flag-5'>執行</b>的

    一條SQL語句是怎么被執行

    直是想知道一條SQL語句是怎么被執行的,它執行的順序是怎樣的,然后查看總結各方資料,就有了下面
    的頭像 發表于 09-12 09:44 ?1518次閱讀
    <b class='flag-5'>一條</b><b class='flag-5'>SQL</b><b class='flag-5'>語句</b>是怎么被<b class='flag-5'>執行</b>的

    簡述SQL更新語句執行流程1

    之前我們講過了一條SQL查詢語句是如何執行的,那么插入(INSERT)、更新(UPDATE)和刪除(DELETE)操作的流程又是什么樣子呢?
    的頭像 發表于 02-14 15:40 ?617次閱讀
    簡述<b class='flag-5'>SQL</b>更新<b class='flag-5'>語句</b>的<b class='flag-5'>執行</b>流程1

    簡述SQL更新語句執行流程2

    之前我們講過了一條SQL查詢語句是如何執行的,那么插入(INSERT)、更新(UPDATE)和刪除(DELETE)操作的流程又是什么樣子呢?
    的頭像 發表于 02-14 15:40 ?539次閱讀
    簡述<b class='flag-5'>SQL</b>更新<b class='flag-5'>語句</b>的<b class='flag-5'>執行</b>流程2

    一條SQL查詢語句是怎么執行的?(中)

    MySQL是典型的`C/S架構`(客戶端/服務器架構),客戶端進程向服務端進程發送段文本(MySQL指令),服務器進程進行語句處理然后返回執行結果。
    的頭像 發表于 03-03 09:58 ?469次閱讀
    <b class='flag-5'>一條</b><b class='flag-5'>SQL</b><b class='flag-5'>查詢</b><b class='flag-5'>語句</b>是怎么<b class='flag-5'>去</b><b class='flag-5'>執行</b>的?(中)

    一條SQL查詢語句是怎么執行的?(下)

    MySQL是典型的`C/S架構`(客戶端/服務器架構),客戶端進程向服務端進程發送段文本(MySQL指令),服務器進程進行語句處理然后返回執行結果。
    的頭像 發表于 03-03 09:58 ?404次閱讀
    <b class='flag-5'>一條</b><b class='flag-5'>SQL</b><b class='flag-5'>查詢</b><b class='flag-5'>語句</b>是怎么<b class='flag-5'>去</b><b class='flag-5'>執行</b>的?(下)

    SQL語句和自定義查詢在導入包中可用

    在高級任務編輯器模式下,您可以選擇要使用的操作-自己鍵入和編輯任何復雜性的SQL語句執行命令)或通過我們的可視化查詢構建器(執行
    的頭像 發表于 04-16 09:13 ?1162次閱讀

    sql查詢語句大全及實例

    SQL(Structured Query Language)是種專門用于數據庫管理系統的標準交互式數據庫查詢語言。它被廣泛應用于數據庫管理和數據操作領域。在本文中,我們將為您詳細介紹SQL
    的頭像 發表于 11-17 15:06 ?1527次閱讀

    sql where條件的執行順序

    。 在深入討論WHERE條件的執行順序之前,先回顧一下一SQL語句執行順序。一條
    的頭像 發表于 11-23 11:31 ?2219次閱讀

    oracle執行sql查詢語句的步驟是什么

    Oracle數據庫是種常用的關系型數據庫管理系統,具有強大的SQL查詢功能。Oracle執行SQL查詢
    的頭像 發表于 12-06 10:49 ?987次閱讀

    MySQL執行過程:如何進行sql 優化

    (1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲在緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將
    的頭像 發表于 12-12 10:19 ?416次閱讀
    MySQL<b class='flag-5'>執行</b>過程:如何進行<b class='flag-5'>sql</b> 優化

    查詢SQL在mysql內部是如何執行

    我們知道在mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句在 MySQ
    的頭像 發表于 01-22 14:53 ?581次閱讀
    <b class='flag-5'>查詢</b><b class='flag-5'>SQL</b>在mysql內部是如何<b class='flag-5'>執行</b>?
    主站蜘蛛池模板: 国精产品一区一区三区有| 欧美重口绿帽video| 最新国产精品福利2020| 精品国产乱码久久久人妻| 色老板影视| 国产精品麻豆AV| 日本理伦片午夜理伦片| 国产97视频在线观看| 亚洲AV国产福利精品在现观看| 91视频18| 色屁屁影院| 超碰免费视频公开97| 午夜阳光影院在线观看视频| 久久精品中文字幕免费| 被强J高H纯肉公交车啊| 亚洲欧美一区二区成人片| 男人把女人桶到爽免费看视频| 国产福利视频第一导航| 曰本xxⅹ孕妇性xxx| 久久热这里只有 精品| xxx日本hd| 日韩hd高清xxxⅹ| 芭乐草莓樱桃丝瓜18岁大全| 午夜福利电影| 美女白虎穴| brazzers欧美孕交| 小泽玛丽av无码观看| 国产欧美第一页| 999久久久国产| 校园纯肉H教室第一次| 年轻的母亲4线在线观看完整| 国产精人妻无码一区麻豆| 国产手机精品一区二区| 依人在线观看| 天天色天天综合网| 国产精品青青青高清在线密亚| 诱受H嗯啊巨肉舍友1V1| 四房色播手机版| 女人和男人插曲视频大全| 北原夏美 快播| 伊人久久丁香色婷婷啪啪|