一. 查詢流程
1.查詢流程中, 每個操作都產生乙個虛擬表, 除了最後乙個,其他對使用者都是透明的.
2.查詢流程
如果在查詢中指定了distinct子句,則會建立一張記憶體臨時表(記憶體中放不下就放磁碟),表結構和虛表一樣,不同的是distinct列,增加了乙個唯一索引,以此來去重資料;
4.物理查詢處理
①parser(分析器)分析sql語句,optimizer(優化器))對sql進行優化,選擇一條最優路徑選取資料.
②新增索引避免笛卡爾積的產生,大幅縮短語句執行的時間;
二. 子查詢概述
子查詢 : select中巢狀另乙個select;
any,in,some,all用法, in是some的別名; not in是 "<>all" 的別名;
三. 獨立子查詢
標量子查詢, 多值子查詢;
獨立子查詢:子查詢對外部查詢無依賴;
相關子查詢: 子查詢對外部查詢有依賴;
mysql對in優化存在乙個問題,如果不是顯示的列定義,如果in('a','b','c'), 則會轉換成exists的相關子查詢;
大多數情況下,mysql都會講獨立子查詢轉換為相關子查詢;
邏輯io次數可能比物理io次數大,可以通過慢查詢日誌,優化邏輯io;
mariadb提供了相對獨立子查詢的優化;如開啟semi join的優化後,不再將in轉化為exists語句, 而是先將獨立子查詢產生的結果生成一張物化檢視,之後在對外部查詢的表進行join操作;
四. 相關子查詢(dependent subquery)
子查詢會對外部查詢的每一行進行一次計算,但是優化器內部有很多優化方式處理;
對相關子查詢的處理, 減少子查詢與外部查詢的匹配次數;
使用派生表優化子查詢,例如,使用子查詢作為派生表b,再將表a和表b進行聯接;
五. exists謂詞
exists 和in
exists只會返回true或false,
in會返回true,false和unknown(當做false處理);
in 和exists大部分情況具有相同的執行計畫,
not in和not exists
not in和not exists具有非常不同的執行計畫;
not in( null),返回的總是false和unknown,
比如 null in ('a','b',null) 返回null;
'c' not in ('a','b',null),返回null;
使用not in可以先過濾掉null值;
六. 派生表
從虛表中產生的,形式: from (subquery expression) as derived_table_alias;
沒有物化,速度可能非常慢,尤其是大資料量的表;
七. maruadb對seemi join的優化 (半連線)
一般形式:
select ...from out_table
where expr in ( select ...from inner_table ...) and ...
目前mysql和oracle將semi join轉換成了exists語句;
table pullout優化
根據唯一索引將子查詢重寫為join語句,
duplicate weedout優化
外部查詢條件列
是唯一的,優化器會先將子查詢查出的結果進行去重.
materilization優化
優化器將獨立子查詢結果填充到一張物化臨時表;
根據join順序,
分為materilization scan: join時將物化臨時表和表聯結;
分為materilization lookup: join時將表和物化臨時聯結;
MySQL技術內幕
innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...
MySQL技術內幕(一)
1.mysql是一種可移植的資料庫,可在多種平台下使用,如linux,solaris,freebsd,mac,windows 2.資料庫和資料庫例項的區別 資料庫是指物理上儲存的檔案的集合 資料庫例項是由後台的執行緒 程序和共享記憶體區組成,操縱資料庫檔案。3.mysql區別於其他資料庫的最重要的特...
Mysql技術內幕筆記
mysql由以下幾個部分組成 連線池元件 管理服務和工具元件 sql介面組價 查詢分析器組價 優化器組價 快取 cache 組價 外掛程式式儲存引擎 物理檔案。可以看出,mysql資料庫區別於其他資料庫的最重要的乙個特點就是其外掛程式式的表儲存引擎。儲存引擎是基於表的,而不是資料庫。是底層物理結構的...