最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一條 SQL 語句執(zhí)行過程

 更新時間:2022年03月16日 11:42:03   作者:JMCui  
這篇文章主要介紹了一條 SQL 語句執(zhí)行過程的相關(guān)資料,沒人詳細具有一的的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)和工作有所幫助

一、MySQL 體系架構(gòu)

- 連接池組件

  • 1、負責(zé)與客戶端的通信,是半雙工模式,這就意味著某一固定時刻只能由客戶端向服務(wù)器請求或者服務(wù)器向客戶端發(fā)送數(shù)據(jù),而不能同時進行。
  • 2、驗證用戶名和密碼是否正確(數(shù)據(jù)庫 MySQL 的 user 表中進行驗證),如果錯誤返回錯誤通知Access denied for user 'root'@'localhost'(using password:YES);如果正確,則會去 MySQL 的權(quán)限表查詢當(dāng)前用戶的權(quán)限。

- 緩存組件

也稱為查詢緩存,存儲的數(shù)據(jù)是以鍵值對的形式進行存儲,如果開啟了緩存,那么在一條查詢 SQL 語句進來時會先判斷緩存中是否包含當(dāng)前的 SQL 語句鍵值對,如果存在直接將其對應(yīng)的結(jié)果返回,如果不存在再執(zhí)行后面一系列操作。如果沒有開啟則直接跳過。

show ?variables ?like ?'have_query_cache'; # 查看緩存配置:
show ?variables ?like ?'query_cache_type'; # 查看是否開啟
show ?variables ?like ?'query_cache_size'; # 查看緩存占用大小
show ?status ?like ?'Qcache%'; # 查看緩存狀態(tài)信息

緩存失效場景:

  • 查詢語句不一致。前后兩條查詢 SQL 必須完全一致;
  • 查詢語句中含有一些不確定的值時,則不會緩存。比如 now()、current_date()、curdate()、curtime()、rand()、uuid() 等;
  • 不使用任何表查詢。如 select 'A';
  • 查詢 mysql、information_schema 或 performance_schema 數(shù)據(jù)庫中的表時,不會走查詢緩存;
  • 在存儲的函數(shù),觸發(fā)器或事件的主體內(nèi)執(zhí)行的查詢;
  • 如果表更改,則使用該表的所有高速緩存查詢都變?yōu)闊o效并從緩存中刪除,這包括使用 MERGE 映射到已更改表的表的查詢。一個表可以被許多類型的語句改變,如 insert、update、delete、truncate table、alter table、drop table、drop database。

通過上面的失效場景可以看出緩存是很容易失效的,所以如果不是查詢次數(shù)遠大于修改次數(shù)的話,使用緩存不僅不能提升查詢效率還會拉低效率(每次讀取后需要向緩存中保存一份,而緩存又容易被清除)。所以在 MySQL5.6 默認是關(guān)閉緩存的,并且在 8.0 直接被移除了。當(dāng)然,如果場景需要用到,還是可以使用的。

開啟:

在配置文件(linux 下是安裝目錄的 cnf 文件,windows 是安裝目錄下的 ini 文件)中,增加配置: query_cache_type = 1

# 指定 SQL_NO_CACHE,SQL_CACHE 同理。
SELECT ?SQL_NO_CACHE ?* ?FROM ?student ?WHERE age > 20;?

- 分析器

對客戶端傳來的 SQL 進行分析,這將包括預(yù)處理與解析過程,并進行關(guān)鍵詞的提取、解析,并組成一個解析樹。具體的解析詞包括但不局限于 select/update/delete/or/in/where/group by/having/count/limit 等,如果分析到語法錯誤,會直接拋給

客戶端異常:ERROR:You have an error in your SQL syntax.。

select * ?from user where userId = 1234;

在分析器中就通過語義規(guī)則器將 select from where 這些關(guān)鍵詞提取和匹配出來,MySQL 會自動判斷關(guān)鍵詞和非關(guān)鍵詞,將用戶的匹配字段和自定義語句識別出來。這個階段也會做一些校驗:比如校驗當(dāng)前數(shù)據(jù)庫是否存在 user 表,同時假如 user 表中不存在 userId 這個字段同樣會報錯:unknown column in field list.。

- 優(yōu)化器

進入優(yōu)化器說明 SQL 語句是符合標準語義規(guī)則并且可以執(zhí)行。優(yōu)化器會根據(jù)執(zhí)行計劃選擇最優(yōu)的選擇,匹配合適的索引,選擇最佳的方案。比如一個典型的例子是這樣的:

表 T,對 A、B、C 列建立聯(lián)合索引 —— (A,B,C),在進行查詢的時候,當(dāng) SQL 查詢條件是:select xx where B=x and A=x and C=x。很多人會以為是用不到索引的,但其實會用到,雖然索引必須符合最左原則才能使用,但是本質(zhì)上,優(yōu)化器會自動將這條 SQL 優(yōu)化為:where A=x and B=x and C=x,這種優(yōu)化會為了底層能夠匹配到索引,同時在這個階段是自動按照執(zhí)行計劃進行預(yù)處理,MySQL 會計算各個執(zhí)行方法的最佳時間,最終確定一條執(zhí)行的 SQL 交給最后的執(zhí)行器。

優(yōu)化器會根據(jù)掃描行數(shù)、是否使用臨時表、是否排序等來判斷是否使用某個索引,其中掃描行數(shù)的計算可以通過統(tǒng)計信息來估算得出,而統(tǒng)計信息可以看作是索引唯一數(shù)的數(shù)量,可以使用部分采樣來估算,具體就是選擇 N 個數(shù)據(jù)頁,統(tǒng)計這些頁上數(shù)據(jù)的不同值,得到一個平均值,然后乘以這個索引的頁面數(shù),就得到了。但是因為索引數(shù)據(jù)會變化,所以索引的統(tǒng)計信息也會變化。當(dāng)變更的數(shù)據(jù)行數(shù)超過 1/M 的時候,就會重新計算一次統(tǒng)計信息。

關(guān)于統(tǒng)計信息可以選擇是否持久化::通過 innodb_stats_persistent,設(shè)置為 on 的時候,表示統(tǒng)計信息會持久化存儲。這時,默認的 N 是 20,M 是 10。設(shè)置為 off 的時候,表示統(tǒng)計信息只存儲在內(nèi)存中。這時,默認的 N 是 8,M 是 16。

沒有使用最優(yōu)索引如何優(yōu)化:

  • 1、雖然會自動更新統(tǒng)計信息,但是但是不能保證統(tǒng)計信息是最新值,這就可能導(dǎo)致優(yōu)化器選擇了不同的索引導(dǎo)致執(zhí)行變慢,所以可以通過 analyze table 表名 來重新計算索引的統(tǒng)計信息;
  • 2、在表名后面添加 force index(索引名) 語句來強制使用索引(不建議);
  • 3、將 SQL 進行修改成優(yōu)化器可以選最優(yōu)索引的實現(xiàn)方式;
  • 4、新建一個最優(yōu)索引或者刪除優(yōu)化器誤用的索引;

- 執(zhí)行器

執(zhí)行器會調(diào)用對應(yīng)的存儲引擎執(zhí)行 SQL,主流的是 MyISAM 和 Innodb。

二、寫操作執(zhí)行過程

三、讀操作執(zhí)行過程

在 MySQL 5.6 之后引入了 索引下推(Index Condition Pushdown),所以在查詢操作上會有一個 Index Filter 和 Table Filter 的過程,查詢的流程圖大致可以用下面這張圖來概括:

四、SQL執(zhí)行順序

到此這篇關(guān)于一條 SQL 語句執(zhí)行過程的文章就介紹到這了,更多相關(guān)SQL 執(zhí)行過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql遷移至8.0時的注意事項(小結(jié))

    mysql遷移至8.0時的注意事項(小結(jié))

    這篇文章主要介紹了mysql遷移至8.0時的注意事項,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 利用Sqoop實現(xiàn)MySQL數(shù)據(jù)導(dǎo)入Hive的全流程

    利用Sqoop實現(xiàn)MySQL數(shù)據(jù)導(dǎo)入Hive的全流程

    在大數(shù)據(jù)領(lǐng)域中,MySQL 和 Hive 是兩種常見的存儲工具,MySQL 適合事務(wù)處理,而 Hive 則是用于離線數(shù)據(jù)分析的利器,本文將全面講解如何使用 Sqoop 將 MySQL 數(shù)據(jù)導(dǎo)入 Hive 的完整流程,包括環(huán)境配置、具體操作步驟以及最佳實踐和常見問題解決方案,需要的朋友可以參考下
    2024-12-12
  • MySQL快速插入一億測試數(shù)據(jù)

    MySQL快速插入一億測試數(shù)據(jù)

    本文主要介紹了MySQL快速插入一億測試數(shù)據(jù),有時候測試需要大量的數(shù)據(jù),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • MySQL5.7.03 更換高版本到MySQL 5.7.17安裝過程及發(fā)現(xiàn)問題解決方案

    MySQL5.7.03 更換高版本到MySQL 5.7.17安裝過程及發(fā)現(xiàn)問題解決方案

    這篇文章主要介紹了MySQL5.7.03 更換高版本到MySQL 5.7.17安裝過程及發(fā)現(xiàn)問題解決方案,需要的朋友可以參考下
    2017-08-08
  • 一個簡單的MySQL備份Shell腳本

    一個簡單的MySQL備份Shell腳本

    這篇文章主要介紹了一個簡單的MySQL備份Shell腳本,本文直接給出代碼實例,需要的朋友可以參考下
    2015-07-07
  • mysql 查詢數(shù)據(jù)庫響應(yīng)時長的方法示例

    mysql 查詢數(shù)據(jù)庫響應(yīng)時長的方法示例

    要查詢MySQL數(shù)據(jù)庫的響應(yīng)時長,通常我們需要測量查詢執(zhí)行的時間,本文主要介紹了mysql 查詢數(shù)據(jù)庫響應(yīng)時長的方法示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Mysql數(shù)據(jù)庫之主從分離實例代碼

    Mysql數(shù)據(jù)庫之主從分離實例代碼

    本篇文章主要介紹了Mysql數(shù)據(jù)庫之主從分離實例代碼,MySQL數(shù)據(jù)庫設(shè)置讀寫分離,可以使對數(shù)據(jù)庫的寫操作和讀操作在不同服務(wù)器上執(zhí)行,提高并發(fā)量和相應(yīng)速度。
    2017-03-03
  • mysql中show指令使用方法詳細介紹

    mysql中show指令使用方法詳細介紹

    mysql中show指令使用過程中會經(jīng)常遇到,在本文將為大家詳細介紹下其具體的使用,需要的朋友不要錯過
    2014-11-11
  • MySQL多列IN查詢的實現(xiàn)

    MySQL多列IN查詢的實現(xiàn)

    多列 IN 查詢是一種強大的篩選工具,它允許通過多字段組合快速過濾數(shù)據(jù),本文主要介紹了MySQL 多列 IN 查詢的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • mysql 維護常用命令

    mysql 維護常用命令

    需要維護mysql數(shù)據(jù)庫的朋友可以參考下。
    2009-11-11

最新評論

沭阳县| 文成县| 吴川市| 航空| 峨山| 固镇县| 长汀县| 嘉黎县| 金坛市| 宝清县| 南通市| 台江县| 岫岩| 高淳县| 越西县| 溧阳市| 达孜县| 朝阳县| 克东县| 鄂温| 兴宁市| 太谷县| 临猗县| 湖南省| 从化市| 平湖市| 大荔县| 富阳市| 锡林浩特市| 东辽县| 和龙市| 阳新县| 秦皇岛市| 新龙县| 纳雍县| 株洲县| 陇西县| 大城县| 那曲县| 南岸区| 怀集县|