從體系結構談SQL優化

2021-09-19 18:04:59 字數 2253 閱讀 9614

首先sql優化,是乙個比較大的話題,我不能說給某個表的某個欄位加索引就可以了,就innodb儲存引擎來說他採用是b+tree的方式

他的實現原理是二叉樹如果這個字段重複資料過多哪二叉樹就是以平行的方式展開加索引的意義不大

還浪費磁碟空間,我們呢要根基實際的業務情況來進行分析的,哪現在怎麼說sql優化呢,我們說sql優化其實還是要了解mysql的

體系結構,是要知道一條sql是怎麼執行的我們才能更好的知道怎麼去優化一條sql!

當一條sql執行時首先呼叫

1:sql介面:接受使用者的sql命令,並且返回使用者需要查詢的結果。

比如select from就是呼叫sql inte***ce

2:是否開啟查詢快取:如果mysql開啟了查詢快取如果資料命中,mysql會檢索使用者是否有許可權,如果有mysql不會對sql進解析等操作

直接返回結果資料,否則進入下一階段

優化點1:

mysql將快取存放在乙個引用表,(這不是乙個table,類似於hashmap的資料結構),通過乙個雜湊值索引,這個雜湊值通過查詢本身,

當前要查詢的資料庫,客戶端協議版本號等一些可能影響結果的資訊計算得來,所以2個查詢在任何字元上的不同(空格,注釋),都會

導致快取不命中

如果查詢中包含任何使用者自定義函式、儲存函式、使用者變數、臨時表、mysql庫中的系統表,其查詢結果都不會被快取 eg:now()

查詢快取寫操作缺點:

mysql查詢快取系統會跟蹤sql查詢中涉及的每張表,當其中涉及查詢的表發生結構和資料的變化,即和這張表相關的所有快取資料

全部失效,也就是說在快取中的表的認為寫操作,mysql都必須把對應的表設定為失效,如果查詢快取非常大或者碎片很多,這個操作就可能帶來很大的系統消耗,

甚至導致系統僵死

查詢快取查詢操作缺點:

a:任何的查詢語句在開始之前都必須經過檢查,即使這條 sql語句 永遠不會命中快取

b:如果查詢結果可以被快取,那麼執行完成後,會將結果存入快取,也會帶來額外的系統消耗

查詢快取都會提高系統效能,快取和失效都會帶來額外系統消耗,特別是寫密集型應用(cpu占用高),只有當快取帶來的資源節約大於其本身消耗的資源時,

才會給系統帶來效能提公升, 可以嘗試開啟查詢快取,並在資料庫設計上做一些優化

a: 用多個小表代替乙個大表,注意不要過度設計

b: 批量插入代替迴圈單條插入

c: 合理控制快取空間大小,一般來說其大小設定為幾十兆比較合適

d: 可以通過 sql_cache 和 sql_no_cache 來控制某個查詢語句是否需要進行快取

sql_no_cache 是禁止快取查詢結果,但並不意味著 cache 不作為結果返回給 query,之前的快取結果之後也可以查詢到

使用方式:

select sql_cache count() from a;count()就是看看有多少條。。

可以在 select 語句中指定查詢快取的選項,對於那些肯定要實時的從表中獲取資料的查詢,或者對於那些一天只執行一次的查詢,

都可以指定不進行查詢快取,使用 sql_no_cache 選項。對於那些變化不頻繁的表,查詢操作很固定,可以將該查詢操作快取起來

,這樣每次執行的時候不實際訪問表和執行查詢,只是從快取獲得結果,可以有效地改善查詢的效能,使用 sql_cache 選項

對於查詢快取的一些操作

flush query cache : 清理查詢快取記憶體碎片

reset query cache : 從查詢快取中移出所有查詢

flush tables : 關閉所有開啟的表,同時該操作將會清空查詢快取中的內容

3:解析器:sql傳遞到解析器的時候會被解析器驗證和解析(解析器是由lex和yacc實現的,是乙個很長的指令碼)

主要功能:1>將sql語句分解成資料結構,並將這個結構傳到後續步驟,以後的sql語句的傳遞和處理就是基於這個結構

:2>如果sql語句在分解成資料結構中遇到錯誤,哪就說明這個sql是不合理的

4:查詢優化器:sql語句會使用查詢優化器對查詢進行優化。他使用的是「選取-投影-聯接」策略進行查詢。

用乙個例子就可以理解: select id,name from user where name= tom;

這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行name過濾

這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾

將這兩個查詢條件聯接起來生成最終查詢結果

5:執行計畫 - 查詢執行引擎 - 呼叫api介面查詢 -( innodb,dbd…) - 資料庫

mysql 體系結構 了解MySQL體系結構

mysql 資料庫體系結構圖 mysql 由以下幾部分組成 1 connectors 不同語言中與 sql 的互動 show variables like connection variable name value character set connection utf8 collation c...

簡述mysql體系結構 MySQL體系結構

一 mysql登入方式 一 tcp ip方式 遠端 本地 mysql uroot poldboy123 h 10.0.0.51 p3306 二 socket方式 mysql uroot poldboy123 s tmp mysql.sock 二 例項介紹 例項 mysqld後台守護程序 主線程 ma...

軟體體系結構 軟體體系結構概論

開學到現在我已經上了三節軟體體系結構的課程,現在我想把自己學到的整理歸納一下。此篇隨筆對應於教材軟體體系結構概論一章。首先談一談我剛接觸這門課程是的感受。那就是 我靠 軟體也會有體系結構?以前只學過資料結構 演算法 基本的程式語言,覺得程式設計無非就是使用者給我需求,我便按照需求來程式設計序就好,從...