主頁 > 資料庫 > 一條SQL陳述句的奇妙旅程

一條SQL陳述句的奇妙旅程

2020-09-13 17:46:15 資料庫

MySQL的邏輯架構

  1.  連接器:負責用戶的身份認證和權限校驗,

  2. 查詢快取:這個在8.0以后的版本已經取締了,但是不影響設計思想的了解,即:當有一個SQL進來的時候,先會去匹配SQL陳述句,如果本地已經有快取,即直接讀快取,回傳結果,乍一聽挺好的功能,為什么會被取締呢?這存在一些設計理念的問題,MySQL追求極高的性能,該功能在實際使用程序中弊大于利,寫快取/清快取的程序可能會大幅度影響性能

  3. 分析器/決議器:這個模塊主要是進行一些語法分析/詞法分析,大家可能覺得與自己關系不太大,其實我們初學SQL陳述句的時候第一個打交道的就是這個模塊,比如當你輸入錯誤陳述句的時候,語法的錯誤在這層就已經發現了,

  4. 前處理器:這個模塊會確定你輸入的表和列是否真實存在,欄位別名是否有歧義,主要是當你語法沒錯的時候,確定是否符合這個場景,

  5. 查詢優化器:這可以說是server層最核心也是實戰最重要的地方了,首先,我們每次可以通過explain+sql來查看當前陳述句的各個屬性,這些屬性能給我們調優很好的建議,這點會在下篇文章中細談,這篇文章總體是為了打通全鏈路,
    其次,我們可以根據show warnings來查看查詢優化器到底做了哪些優化,從而考慮優化是否得當,

  6. 執行引擎:這塊主要是對結果進行過濾和排序,這個模塊的命名有些歧義,其實真實的資料檢索并非在這里進行,這層進行的是對檢索的結果集進行一次過濾和排序,

  7. 存盤引擎:這里就是真正的核心了,也就是我們一直所說的innodb、myisam等存盤引擎作業的地方,我們所有的查詢檢索任務都是在這里進行的,所有的存盤也是在這里進行,這個模塊也會在之后的文章中分析,

現在來假設一條SQL來做全套了,那么它會是怎樣的一個邏輯呢?

首先我們客戶端與服務器之間會建立一個連接(這里的連接是指那幾種行程通信方式中的一種,大部分情況下說的是TCP/IP進行連接的,程序中需要我們mysql -u root -p輸入密碼,就可以進入mysql,

此時我們可以通過SQL陳述句進行增刪改查,當我們輸入一條陳述句,倘若在5.8版本之前,這條陳述句會進入查詢快取,在這個模塊中先對SQL陳述句進行匹配,倘若找到完全匹配的快取,則讀快取回傳結果,倘若沒有匹配的,則會進入下一模塊,查詢到的結果會寫進寫快取這也是之所以在5.8以后取締掉查詢快取的原因:寫快取對性能是有一定的影響的,事實上這個影響甚至大于其對速度的提升,

進入下一模塊以后,會對陳述句進入一些詞法分析和語法分析,看看有沒有語法上的錯誤,初學者經常被卡在這個模塊,因為陳述句寫的不規范之類的問題,

再到后來,這條陳述句會進入前處理器,也就是看看你雖然說的都對,語法都對,但是你搜索的列如果是我根本沒有的,那相當于什么都沒有,如果一切正常,就再往后走,

此時進入了server層最核心的查詢優化器,這里MySQL有自己的想法, 他會對你輸入的陳述句進行一些優化和重排,這里有一個很細節但是很核心的點:任何關聯進入查詢優化器都會變成嵌套回圈關聯,也就是說,很多復雜的關聯都會變成類似于左連接之類的關聯,其原因也非常簡單,正如上述:執行引擎是對結果進行過濾和排序,那么如果我們可以通過優化陳述句提前對陳述句進行過濾,這樣就可以大幅度提高性能,當我們查詢Explain+sql陳述句的時候會出現很多的屬性,我們需要注意的是要避免外部排序的產生,因為這樣會產生巨大的性能影響,

查詢優化器畢竟不是十全十美的,它的很多優化可能是好心沒做好事,最典型的就是臨時表了,首先臨時表這個東西本身是非常好的,它將中間程序的一些結果集存盤在記憶體上,很有利于查詢程序的執行,但是有可能記憶體不足的情況下,會將資料存盤在磁盤上,而磁盤參與讀寫一定會帶來非必要的資源和性能消耗,因此我們必須結合實際情況考究某些屬性的存在是否合理,

查詢優化器之后,查詢進入了執行引擎,在這里其實并未進行太多的事情,執行引擎主要是調度存盤引擎,然后存盤引擎在硬碟中去檢索,然后拿到結果回傳執行引擎,由執行引擎進行結果的過濾和排序,然后回傳結果集回到客戶端,如果是在5.8以前的話,會放入寫快取,

接下來就是核心的問題了:存盤引擎,

我們常用的存盤引擎大概是innodb和myisam,這兩任默認引擎撐起了MySQL的半邊天,現在我會比較粗略的介紹一下兩個引擎,詳細的文章會在后期輸出,

innodb存盤引擎與myisam存盤引擎

首先我們先認識所謂存盤引擎最重要的兩個功能就是存盤與查詢,那么我們從存盤和查詢兩個方面來分析一下這兩個引擎的特點,

存盤方面:
首先當我們存盤資料的時候,因為這兩個引擎都是基于磁盤的,innodb是將索引和資料放在一起的,這跟其索引結構有關,當進行存盤的時候,innodb將所有的資料都存盤在一起;而myisam則是將索引資料和真實資料分開存盤,這樣其實是通過索引進行檢索,得到的結果是一個真實資料的指標,然后進入資料檔案中進行隨機io,這就決定了一點,如果我們是innodb存盤引擎的話,主鍵盡量自增,因為如果非自增,會導致不能進行順序io,性能會有很大的退化,而myisam的資料存盤位置不能輕易移動,因為這樣會導致索引失效,也會影響性能,

查詢方面:
查詢就像翻詞典一樣,索引就像目錄和頁碼,這是非常重要的一部分,很多初學者覺得自己非常少用到索引,其實不然,我們經常用到的主鍵便是最標準的索引,當你的查詢命中索引的時候,便可以進入高速列車,為什么呢?因為資料結構,在此強調一下,一直很認同程式=資料結構+演算法,資料結構非常重要,如果我們能命中索引,就可以進入索引的資料結構,此時要么是哈希索引,要么是b+樹索引,這兩種索引一個的復雜度為O(1),一個是O(log(M)N),其中M為索引關鍵字,N為總關鍵字數量,很容易看到,這種速度比全表遍歷好了太多了,所以如果命中索引的話,就可以大幅度提高速率,

當然這兩點雖然重要,但是都不是兩種引擎最大的區別,這兩種存盤引擎最大的差別在于事務性和鎖的粒度上,這也是innodb彎道超車最重要的原因,

事務性

隨著資料庫的應用場景越來越多,我們對資料的安全性有了越來越多的需求,myisam不支持事務,這導致這種存盤引擎很快的落時了,

鎖粒度

并不是說myisam完全不考慮資料安全性,只是它的粒度有些太大了,它為了資料的安全直接動用了表級鎖,直接導致性能影響太大,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26189.html

標籤:MySQL

上一篇:學習通的workId元素為什么找不到了,是不是被隱藏了

下一篇:使用組態王注冊KVDevManOcx.ocx控制元件出現這個

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more