oracle和mysql文件怎么打开_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明-sql文件怎么打开...
概述
之前分享的主要是Oracle上的一些內(nèi)容,那么mysql又有哪些地方不一樣呢?下面從MySQL總體架構(gòu)、sql查詢執(zhí)行流程和語句執(zhí)行順序來看一下。。
01
架構(gòu)總覽
下面看一下mysql的架構(gòu)圖:
mysql架構(gòu)
從上圖中我們可以看到,整個(gè)架構(gòu)分為兩層,上層是MySQLD的被稱為的‘SQL Layer’,下層是各種各樣對上提供接口的存儲(chǔ)引擎,被稱為‘Storage Engine Layer’。其它各個(gè)模塊和組件,從名字上就可以簡單了解到它們的作用,這里就不多做介紹了。
再看一下Oracle的架構(gòu):
Oracle系統(tǒng)體系結(jié)構(gòu)由三部分組成:邏輯結(jié)構(gòu)、物理結(jié)構(gòu)和實(shí)例。
02
查詢執(zhí)行流程
理解sql查詢執(zhí)行的流程對優(yōu)化是很重要的,下面介紹下mysql的查詢執(zhí)行流程:
1.連接1.1客戶端發(fā)起一條Query請求,監(jiān)聽客戶端的‘連接管理模塊’接收請求
1.2將請求轉(zhuǎn)發(fā)到‘連接進(jìn)/線程模塊’
1.3調(diào)用‘用戶模塊’來進(jìn)行授權(quán)檢查
1.4通過檢查后,‘連接進(jìn)/線程模塊’從‘線程連接池’中取出空閑的被緩存的連接線程和客戶端請求對接,如果失敗則創(chuàng)建一個(gè)新的連接請求
2.處理2.1先查詢緩存,檢查Query語句是否完全匹配,接著再檢查是否具有權(quán)限,都成功則直接取數(shù)據(jù)返回
2.2上一步有失敗則轉(zhuǎn)交給‘命令解析器’,經(jīng)過詞法分析,語法分析后生成解析樹
2.3接下來是預(yù)處理階段,處理解析器無法解決的語義,檢查權(quán)限等,生成新的解析樹
2.4再轉(zhuǎn)交給對應(yīng)的模塊處理
2.5如果是SELECT查詢還會(huì)經(jīng)由‘查詢優(yōu)化器’做大量的優(yōu)化,生成執(zhí)行計(jì)劃
2.6模塊收到請求后,通過‘訪問控制模塊’檢查所連接的用戶是否有訪問目標(biāo)表和目標(biāo)字段的權(quán)限
2.7有則調(diào)用‘表管理模塊’,先是查看table cache中是否存在,有則直接對應(yīng)的表和獲取鎖,否則重新打開表文件
2.8根據(jù)表的meta數(shù)據(jù),獲取表的存儲(chǔ)引擎類型等信息,通過接口調(diào)用對應(yīng)的存儲(chǔ)引擎處理
2.9上述過程中產(chǎn)生數(shù)據(jù)變化的時(shí)候,若打開日志功能,則會(huì)記錄到相應(yīng)二進(jìn)制日志文件中
3.結(jié)果3.1Query請求完成后,將結(jié)果集返回給‘連接進(jìn)/線程模塊’
3.2返回的也可以是相應(yīng)的狀態(tài)標(biāo)識(shí),如成功或失敗等
3.3‘連接進(jìn)/線程模塊’進(jìn)行后續(xù)的清理工作,并繼續(xù)等待請求或斷開與客戶端的連接
最后一圖做小總結(jié):
mysql查詢執(zhí)行流程
在看一下Oracle的sql查詢執(zhí)行流程:
1、當(dāng)一用戶第一次提交一個(gè)SQL表達(dá)式時(shí),Oracle會(huì)將這SQL進(jìn)行Hard parse,這過程有點(diǎn)像程序編譯,檢查語法、表名、字段名等相關(guān)信息(如下圖),這過程會(huì)花比較長的時(shí)間,因?yàn)樗治稣Z句的語法與語義。然后獲得最優(yōu)化后的執(zhí)行計(jì)劃(sql plan),并在內(nèi)存中分配一定的空間保存該語句與對應(yīng)的執(zhí)行計(jì)劃等信息。
2、當(dāng)用戶第二次請求或多次請求時(shí),Oracle會(huì)自動(dòng)找到先前的語句與執(zhí)行計(jì)劃,而不會(huì)進(jìn)行Hard parse,而是直接進(jìn)行Soft parse(把語句對應(yīng)的執(zhí)行計(jì)劃調(diào)出,然后執(zhí)行),從而減少數(shù)據(jù)庫的分析時(shí)間。
注意的是:Oracle中只能完全相同的語句,包大小寫、空格、換行都要求一樣時(shí),才會(huì)重復(fù)使用以前的分析結(jié)果與執(zhí)行計(jì)劃。
03
SQL解析順序
這一塊Oracle和mysql都是一樣的,所以就不區(qū)別開了。看一個(gè)實(shí)例:SELECT DISTINCT
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
ORDER BY
< order_by_condition >
LIMIT < limit_number >
執(zhí)行順序是這樣的1 FROM
2 ON
3 JOIN
4 WHERE
5 GROUP BY
6 HAVING
7 SELECT
8 DISTINCT
9 ORDER BY
10 LIMIT
一看還是很自然和諧的,從哪里獲取,不斷的過濾條件,要選擇一樣或不一樣的,排好序,那才知道要取前幾條呢。
總結(jié)一下:
sql解析順序
總結(jié)
后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~
總結(jié)
以上是生活随笔為你收集整理的oracle和mysql文件怎么打开_Oracle vs Mysql--架构、sql查询执行流程及SQL解析顺序区别说明-sql文件怎么打开...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL查询输入三个数的和_mysql
- 下一篇: toad连接oracle12c,[201