隨着曾經的一期MYSQL來自“舊金山的信息”中,MYSQL 8 大舉更改數據庫的優化器的事情已經是在目前版本上大舉實現的事情了。而上期說的一些ORACLE 認爲曾經在MYSQL上不應該實現的“好”功能,也都被取消了。同時祭出了新的MYSQL的查詢分析, Explain analyze ,我們來看看 MYSQL 8 在這方面更改了多少。
首先我們看一個列子,在MYSQL5.7 上可以運行的一個查詢
select distinct(es.emp_no),ss.salary,concat(es.last_name,' ',es.first_name)
from employees as es
left join salaries as ss on es.emp_no = ss.emp_no where ss.salary > 91530
group by emp_no
having max(ss.salary) ;
可以看到,這是可以查詢出結果的。(但實際上這不符合 SQL 92的標準)
所以我們看看來自舊金山的 ORACLE OPEN 大會中提到的,那些不應該發生的“事情”,已經不能在MYSQL8.X上發生了,(默認SQL MODE 配置)
所以這也是上期提到了,MYSQL 的 DEVELOPER 需要接受的一些改變。
在傳統的 EXPLAIN 中給出的執行計劃有以下問題
1 給出的執行計劃比較簡單,對於複雜的查詢分析出的計劃閱讀困難,關聯性無法體現
2 給出的執行計劃並非十分準確,而是評估的計劃,如果要看實際的執行計劃,必須進行真實的運算後,才能得到真實的執行計劃
select concat(es.first_name,' ',es.last_name),ts.title
from employees as es
left join titles as ts on es.emp_no = ts.emp_no
where ts.title = 'manager' and to_date = '9999-01-01';
我們以上面的語句作爲例子
| -> Nested loop inner join (cost=46084.11 rows=4422) (actual time=108.896..309.845 rows=9 loops=1)
-> Filter: ((ts.to_date = DATE'9999-01-01') and (ts.title = 'manager') and (ts.emp_no is not null)) (cost=44536.30 rows=4422) (actual time=108.366..309.135 rows=9 loops=1)
-> Table scan on ts (cost=44536.30 rows=442233) (actual time=0.516..204.424 rows=443308 loops=1)
-> Single-row index lookup on es using PRIMARY (emp_no=ts.emp_no) (cost=0.25 rows=1) (actual time=0.070..0.071 rows=1 loops=9)
從上面給出的計劃來看,1 先對 TS 進行 TABLE SCAN 行數 442233 行,實際上是 443308 行, 通過 INDEX LOOKUP 的方式,每次掃描使用0.07毫秒,並且同時會過濾 to_date, title emp_no 等條件 採用 Nested loop inner join 的方式。
實際上透露了大約執行的時間和執行的次序,每行的操作的COST 等等時間,這點和ORACLE 是越來越像。並且還告訴你,實際的執行計劃走的 INNER JOIN
我們在看一個列子
完全是ORALCE的風格。
當然也可以寫成另外一種格式,輸出是一樣的
explain format=tree select concat(es.first_name,' ',es.last_name),ts.title from employees as es left join titles as ts on es.emp_no = ts.emp_no where ts.title = 'manager' and to_date = '9999-01-01';
另外可能有細心的同學會看到,actual time= xxx .. xxxxx 這裏的意思是單行成本時間 和 總體成本時間,所以EXPLAIN ANALYZE 的輸出已經完全和ORACLE 接軌,或者說和所有的數據庫接軌( 因爲 ORACLE , PG , SQL SERVER )都可以這樣顯示執行計劃,SQL SERVER 甚至可以動態圖的方式給你顯示。
那麼從MYSQL 8 開始一套整體的查看執行計劃,或評估計劃的方式已經是成爲體系
1 評估執行計劃可以使用 explain format=tree
2 實際的執行計劃直接 explain analyze
3 明白執行計劃選擇的方式與路徑 optimizer trace
所以MYSQL 8 的確是一份認真的作業。
共享文件,共享知識,抵禦風險,可入羣