日韩天堂,国产精品久久久久久久久久一区,羞羞羞网站,自拍视频网站,久久亚洲欧美成人精品,桃花阁成人网在线观看

Hello! 歡迎來到小浪云!


SQL查詢語句是如何執(zhí)行的


avatar
小浪云 2024-12-07 173

大家好!這是我的第一篇文章。

這篇文章我將介紹一條sql查詢語句是如何執(zhí)行的

下面是mysql架構圖:

SQL查詢語句是如何執(zhí)行的

總的來說,mysql可以分為兩部分:服務器層和存儲引擎層。

服務器層包括連接器、查詢緩存、解析器、優(yōu)化器、執(zhí)行器等,包含mysql的大部分核心服務功能,以及所有內置功能(如日期、時間、數學和加密)功能)。所有跨存儲引擎的功能,例如存儲過程、觸發(fā)器和視圖都在這一層實現。

存儲引擎層負責數據的存儲和檢索。其架構是基于插件的,支持innodb、myisam、memory等多種存儲引擎。從mysql 5.5.5開始,innodb成為mysql的默認存儲引擎。

創(chuàng)建表時可以使用帶有engine=memory的create table語句指定內存引擎。

不同的存儲引擎共享同一個server層

連接器

第一步是連接數據庫,這需要連接器。連接器負責與客戶端建立連接、獲取權限并維護和管理連接。連接命令為:

mysql -h$ip -p$port -u$user -p 

命令用于與服務器建立連接。完成經典的 tcp 握手后,連接器將使用提供商的用戶名和密碼來驗證您的身份。

  • 如果用戶名或密碼不正確,您將收到“用戶錯誤導致訪問被拒絕”的消息,并且客戶端程序將終止。
  • 如果身份驗證成功,連接器將從權限表中檢索當前帳戶的權限。此連接期間的所有權限檢查都依賴于此初始檢索。

這意味著一旦連接成功建立,管理員對用戶權限所做的任何更改都不會影響現有連接的權限。只有新連接才會使用更新后的權限設置。

連接建立后,如果沒有后續(xù)動作,則連接進入空閑狀態(tài),可以使用show processlist命令查看:

SQL查詢語句是如何執(zhí)行的

如果客戶端長時間處于不活動狀態(tài),連接器將自動斷開連接。持續(xù)時間由 wait_timeout 參數控制,默認為 8 小時。

如果連接終止并且客戶端發(fā)送請求,則會收到錯誤消息:在查詢期間丟失與 mysql 服務器的連接。要繼續(xù),您需要重新連接,然后執(zhí)行請求。

數據庫中,持久連接是指客戶端在成功連接后為連續(xù)請求保持相同的連接。短連接是指在幾次查詢后斷開連接并重新連接以進行后續(xù)查詢。

由于連接過程比較復雜,建議開發(fā)過程中盡量減少連接的創(chuàng)建,即盡可能使用持久連接。

但是,當使用持久連接時,mysql 的內存使用量可能會顯著增加,因為執(zhí)行期間使用的臨時內存是在連接對象內管理的。僅當連接終止時,這些資源才會被釋放。如果長連接不斷累積,可能會導致內存使用過多,導致系統(tǒng)強行終止mysql(oom),導致意外重啟。

解決方案

  1. 定期斷開持久連接。使用連接一段時間或執(zhí)行消耗過多內存的查詢后,請斷開連接并重新連接以進行后續(xù)查詢。
  2. 如果您使用的是 mysql 5.7 或更高版本,您可以在執(zhí)行資源密集型操作后使用 mysql_reset_connection 來重新初始化連接資源。此過程不需要重新連接或重新驗證,而是將連接重置為剛剛創(chuàng)建的狀態(tài)。

查詢緩存

注意:從 mysql 8.0 開始,查詢緩存功能已被完全刪除,因為其弊大于利。

當mysql收到查詢請求時,它首先檢查查詢緩存,看看這個查詢之前是否已經執(zhí)行過。之前執(zhí)行過的查詢及其結果以鍵值對的形式緩存在內存中。鍵是查詢語句,值是結果。如果在查詢緩存中找到該鍵,則將該值直接返回給客戶端。

如果在查詢緩存中未找到查詢,則過程繼續(xù)。

為什么查詢緩存弊大于利?

查詢緩存失效的情況非常頻繁地發(fā)生。對表的任何更新都會清除與該表相關的所有查詢緩存,導致緩存命中率非常低,除非該表是靜態(tài)配置表。

mysql提供了一種“按需”的方法來使用查詢緩存。通過將參數query_cache_type設置為demand,sql語句默認不會使用查詢緩存。要使用查詢緩存,可以顯式指定 sql_cache:

select sql_cache * from t where id=10; 

解析器

如果查詢緩存沒有命中,則語句執(zhí)行過程開始。 mysql 首先需要了解要做什么,因此它會解析 sql 語句。

解析器首先執(zhí)行詞法分析。輸入的 sql 語句由字符串和空格組成,mysql 會對其進行分析,以識別每個部分代表的含義。例如select標識為查詢語句,t標識為表名,id標識為列。

詞法分析之后,進行語法分析。語法分析器根據詞法分析的結果判斷sql語句是否符合mysql的語法規(guī)則。

如果存在語法錯誤,將會顯示類似“您的 sql 語法有錯誤”的錯誤消息。例如,在以下查詢中,select 關鍵字拼寫錯誤:

mysql> elect * from t where id=1;  error 1064 (42000): you have an error in your sql syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'elect * from t where id=1' at line 1 

優(yōu)化器

解析之后,mysql 知道你想做什么。接下來,優(yōu)化器確定如何執(zhí)行。

當一個表有多個索引時,優(yōu)化器決定使用哪個索引,或者當查詢涉及多個表時,優(yōu)化器決定表連接的順序。例如,在以下查詢中:

select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 

查詢可以從檢索 t1 或 t2 中的值開始。兩種方法產生相同的邏輯結果,但它們的性能可能不同。優(yōu)化器的作用是選擇最有效的計劃。

優(yōu)化階段結束后,流程進入執(zhí)行器。

執(zhí)行者

執(zhí)行器開始執(zhí)行查詢。

執(zhí)行前,首先檢查當前連接是否有查詢表的權限。如果沒有,則返回錯誤,指示權限不足。 (從查詢緩存返回結果時也會執(zhí)行權限檢查。)

如果授予權限,則打開表并繼續(xù)執(zhí)行。在此過程中,執(zhí)行器根據表的引擎定義與存儲引擎進行交互。

例如,假設表 t 在 id 列上沒有索引。執(zhí)行者的執(zhí)行過程如下:

  1. 調用innodb引擎接口取出表的第一行,檢查id值是否為10,如果不是則跳過;如果是,則將其添加到結果集中。
  2. 調用引擎接口獲取“下一行”,重復相同的邏輯,直到檢查完所有行。
  3. 執(zhí)行器將累積的結果集返回給客戶端。

至此,查詢完成。

對于索引表,該過程涉及使用引擎的預定義方法來迭代獲取“第一個匹配行”和“下一個匹配行”。

慢查詢日志中,rows_examined字段表示查詢執(zhí)行過程中掃描的行數。每次執(zhí)行器調用引擎檢索數據行時,該值都會累加。

在某些情況下,對執(zhí)行器的單次調用可能涉及在引擎內部掃描多行。因此,引擎掃描的行數不一定等于 rows_examined.

結尾

感謝您的閱讀!希望文章對您有所幫助。

相關閱讀

主站蜘蛛池模板: 成人精品一区二区久久久 | 亚洲精品tv久久久久久久久 | 羞羞视频网 | www.五月| 在线观看精品国产 | 一级肉体片在线观看 | 亚洲自拍中文 | 亚洲电影免费在线看精品国产 | 色伊人色成人婷婷六月丁香 | 日本一区二区三区在线观看视频 | 伊人青草 | 伊人激情在线 | 影电影在线观看免费高清完整版 | 国产亚洲精品国产 | 精品久久久久久久一区二区手机版 | 宅男视频在线观看免费高清完整 | 久久人人爽人人爽人人片av不 | 亚洲理论电影 | 五月激情六月婷婷 | 亚洲 欧美 自拍 卡通 综合 | 五月欧美激激激综合网色播 | 亚洲自拍激情 | 亚洲一区视频在线 | 色免费在线 | 伊在人亚洲香蕉精品区麻豆 | 综合激情在线 | 福利精品一区 | 日本波多野结衣在线观看 | 亚洲一区二区精品推荐 | 九色视频在线看 | 一级国产视频 | 久久 精品 一区二区 | 精品九九久久国内精品 | 亚洲男人天堂网 | 欧美一区永久视频免费观看 | 日本国产一区 | 中文永久免费观看网站 | 自拍视频国产 | 女男羞羞视频网站免费 | 亚洲成a人一区二区三区 | 四虎成人网 |