sqlite3數(shù)據(jù)庫(kù)怎么看表,視圖之間的關(guān)系? ;的菜單欄有一個(gè)鍵 "顯示圖表窗格 ",這是顯示圖表的關(guān)鍵。選擇一個(gè)表,然后單擊此鍵查看關(guān)系表。要查看表之間的關(guān)系,只需將其他表拖到窗口中。視圖是一個(gè)查
sqlite3數(shù)據(jù)庫(kù)怎么看表,視圖之間的關(guān)系?
;的菜單欄有一個(gè)鍵 "顯示圖表窗格 ",這是顯示圖表的關(guān)鍵。選擇一個(gè)表,然后單擊此鍵查看關(guān)系表。要查看表之間的關(guān)系,只需將其他表拖到窗口中。視圖是一個(gè)查詢(xún)語(yǔ)句視圖,使用時(shí)是一個(gè)表。但是,只能更新單個(gè)基表的行和列投影。視圖主要用于映射模式到外部模式。有時(shí),查詢(xún)和子查詢(xún)會(huì)被應(yīng)用太多次,視圖也被用來(lái)增加可讀性。
sql 數(shù)據(jù)庫(kù)系統(tǒng)的體系結(jié)構(gòu)是兩級(jí)模式結(jié)構(gòu)?
SQL數(shù)據(jù)庫(kù)系統(tǒng)的體系結(jié)構(gòu)不是兩級(jí)模式結(jié)構(gòu),而是三級(jí)模式結(jié)構(gòu)。SQL數(shù)據(jù)庫(kù)的數(shù)據(jù)架構(gòu)基本上是三層結(jié)構(gòu)。在SQL中,關(guān)系模式被稱(chēng)為 "基礎(chǔ)表 "存儲(chǔ)模式(內(nèi)部模式)稱(chēng)為 "存儲(chǔ)文件 "子模式(外部模式)被稱(chēng)為 "查看 "一個(gè)元組稱(chēng)為一行;該屬性稱(chēng)為列。本文將分析Mysql中下一條sql語(yǔ)句的執(zhí)行過(guò)程,包括sql的查詢(xún)將如何在Mysql內(nèi)部流動(dòng),以及SQL語(yǔ)句的更新是如何完成的。在分析之前,我先給大家展示一下MySQL的基礎(chǔ)架構(gòu),了解一下MySQL由哪些組件組成,可以幫助我們理解和解決這些問(wèn)題。一個(gè)MySQL基礎(chǔ)架構(gòu)分析1.1 MySQL基礎(chǔ)架構(gòu)概述下圖是MySQL的簡(jiǎn)要架構(gòu)圖。從下圖中,你可以清楚地看到用戶(hù)是如何 的SQL語(yǔ)句在MySQL內(nèi)部執(zhí)行。讓 下面我們簡(jiǎn)單介紹一下下圖中涉及到的一些組件的基本功能,幫助你理解這個(gè)圖,這些組件的功能將在1.2節(jié)詳細(xì)介紹。連接器:認(rèn)證與權(quán)限相關(guān)(登錄MySQL時(shí))。查詢(xún)緩存在執(zhí)行一條查詢(xún)語(yǔ)句的時(shí)候,會(huì)先查詢(xún)緩存(MySQL版以后去掉了,因?yàn)檫@個(gè)功能不是很實(shí)用)。如果解析器不;如果沒(méi)有命中緩存,SQL語(yǔ)句將通過(guò)解析器。說(shuō)白了,解析器首先要看你的SQL語(yǔ)句是干什么用的,然后檢查你的SQL語(yǔ)句的語(yǔ)法是否正確。優(yōu)化器:按照MySQL認(rèn)為最好的方案實(shí)現(xiàn)。執(zhí)行器執(zhí)行該語(yǔ)句,然后從存儲(chǔ)引擎返回?cái)?shù)據(jù)。簡(jiǎn)單來(lái)說(shuō),MySQL主要分為服務(wù)器層和存儲(chǔ)引擎層:服務(wù)器層:主要包括連接器、查詢(xún)緩存、分析器、優(yōu)化器、執(zhí)行器等。,跨存儲(chǔ)引擎的所有功能。都是在這一層實(shí)現(xiàn)的,比如存儲(chǔ)過(guò)程、觸發(fā)器、視圖、函數(shù)等。,而且還有一個(gè)通用的日志模塊,binglog日志模塊。存儲(chǔ)引擎:主要負(fù)責(zé)數(shù)據(jù)存儲(chǔ)和讀取,采用可替換插件架構(gòu),支持InnoDB、MyISAM、Memory等多種存儲(chǔ)引擎,其中InnoDB引擎自帶日志模塊redolog模塊?,F(xiàn)在最常用的存儲(chǔ)引擎是InnoDB,從MySQL 5 . 5 . 5版開(kāi)始就被視為默認(rèn)的存儲(chǔ)引擎。1.2服務(wù)器層基本組件介紹1)連接器連接器主要是與認(rèn)證和權(quán)限相關(guān)的功能,就像一個(gè)高級(jí)門(mén)衛(wèi)。它主要負(fù)責(zé)用戶(hù)登錄數(shù)據(jù)庫(kù)和用戶(hù)認(rèn)證。;的身份,包括檢查賬戶(hù)密碼、權(quán)限等操作。如果用戶(hù) 的帳戶(hù)密碼已過(guò),連接器將在權(quán)限表中查找該用戶(hù)的所有權(quán)限,然后該連接中權(quán)限的邏輯判斷將取決于此時(shí)讀取的權(quán)限數(shù)據(jù),也就是說(shuō),只要連接持續(xù)打開(kāi),即使管理員修改了用戶(hù) 的權(quán)限。2)查詢(xún)緩存(MySQL版后移除)查詢(xún)緩存主要用于緩存我們執(zhí)行的SELECT語(yǔ)句以及該語(yǔ)句的結(jié)果集。連接建立后,執(zhí)行查詢(xún)語(yǔ)句時(shí),會(huì)先查詢(xún)緩存。Mysql會(huì)先檢查這條sql是否已經(jīng)執(zhí)行,并以Key-Value的形式緩存在內(nèi)存中,其中Key是查詢(xún)預(yù)期,Value是結(jié)果集。如果命中緩存鍵,將直接返回給客戶(hù)端。如果未命中,則執(zhí)行后續(xù)操作,完成后緩存結(jié)果,方便下次調(diào)用。當(dāng)然,當(dāng)實(shí)際執(zhí)行緩存查詢(xún)時(shí),用戶(hù) 的權(quán)限,以及該表是否有查詢(xún)條件。不建議對(duì)MySQL查詢(xún)使用緩存,因?yàn)樵趯?shí)際的業(yè)務(wù)場(chǎng)景中,查詢(xún)緩存失效可能會(huì)非常頻繁。如果更新一個(gè)表,該表上的所有查詢(xún)緩存都將被清空。對(duì)于不經(jīng)常更新的數(shù)據(jù),仍然可以使用緩存。因此,在大多數(shù)情況下,我們一般不 不建議使用查詢(xún)緩存。MySQL版之后,刪除了緩存功能,官方認(rèn)為實(shí)際應(yīng)用場(chǎng)景中該功能較少,所以干脆刪除了。3)如果MySQL沒(méi)有 t命中緩存,它將進(jìn)入分析器。分析器主要用來(lái)分析SQL語(yǔ)句是干什么用的。分析器也會(huì)分為幾個(gè)步驟:第一步是詞法分析。SQL語(yǔ)句由多個(gè)字符串組成。首先,您必須提取關(guān)鍵字,例如select、用于查詢(xún)的表、字段名稱(chēng)、查詢(xún)條件等等。完成這些操作后,你將進(jìn)入第二步。第二步,語(yǔ)法分析,主要是判斷你輸入的sql是否正確。MySQL的語(yǔ)法。完成這兩步,MySQL就準(zhǔn)備開(kāi)始執(zhí)行了,但是怎么執(zhí)行,怎么執(zhí)行才是最好的結(jié)果?這時(shí)候優(yōu)化器就需要發(fā)揮作用了。4)優(yōu)化器和放大器;;的作用是實(shí)現(xiàn)它認(rèn)為最優(yōu)的執(zhí)行方案(有時(shí)可能不是最優(yōu)的,本文涉及到對(duì)這部分知識(shí)的深入講解),比如使用多個(gè)索引時(shí)如何選擇索引,查詢(xún)多個(gè)表時(shí)如何選擇關(guān)聯(lián)順序??梢哉f(shuō)優(yōu)化器之后,可以說(shuō)如何執(zhí)行這個(gè)語(yǔ)句已經(jīng)決定了。5)當(dāng)執(zhí)行者選擇執(zhí)行方案時(shí),MySQL準(zhǔn)備開(kāi)始執(zhí)行。在執(zhí)行之前,它會(huì)檢查用戶(hù)是否有權(quán)限。否則,它將返回一條錯(cuò)誤消息。如果有權(quán)限,它會(huì)調(diào)用引擎的接口,返回接口執(zhí)行的結(jié)果。兩句話(huà)分析2.1查詢(xún)語(yǔ)句說(shuō)了這么多,那么一條sql語(yǔ)句是如何執(zhí)行的呢?其實(shí)我們的sql可以分為兩種,一種是查詢(xún),一種是更新(添加、更新、刪除)。讓 s先分析一下查詢(xún)語(yǔ)句,如下:select * from tb_student A where和張三。結(jié)合以上描述,讓 s分析一下這條語(yǔ)句的執(zhí)行過(guò)程:先檢查語(yǔ)句是否有權(quán)限,如果沒(méi)有,直接返回錯(cuò)誤信息。如果有,在Mysql8.0版本之前,我們會(huì)先查詢(xún)緩存,以這條sql語(yǔ)句為關(guān)鍵字查詢(xún)內(nèi)存中是否有結(jié)果。如果有直接緩存,如果沒(méi)有,我們將執(zhí)行下一步。由分析器進(jìn)行詞法分析,提取sql語(yǔ)句的關(guān)鍵元素,比如提取上面的語(yǔ)句是query select,提取要查詢(xún)的表名為tb_student,需要查詢(xún)所有列,查詢(xún)條件為該表的id1。然后判斷這條sql語(yǔ)句是否存在語(yǔ)法錯(cuò)誤,比如關(guān)鍵詞是否正確等。如果沒(méi)有問(wèn)題,執(zhí)行下一步。接下來(lái),優(yōu)化器確定執(zhí)行方案。上面的sql語(yǔ)句可以有兩種執(zhí)行方案:a .首先查詢(xún)名為 "張三 "在學(xué)生表中,然后判斷年齡是否為18歲。首先找出18歲的學(xué)生,然后查詢(xún)名字是 "張三 "。然后優(yōu)化器根據(jù)自己的優(yōu)化算法選擇最高效的方案(優(yōu)化器認(rèn)為有時(shí)候不一定是最好的)。然后確認(rèn)執(zhí)行計(jì)劃后,就準(zhǔn)備開(kāi)始執(zhí)行了。檢查權(quán)限。如果沒(méi)有權(quán)限,將返回一條錯(cuò)誤消息。如果有權(quán)限,會(huì)調(diào)用數(shù)據(jù)庫(kù)引擎接口,返回引擎的執(zhí)行結(jié)果。2.2上面的update語(yǔ)句是一個(gè)查詢(xún)sql的執(zhí)行過(guò)程,所以讓 讓我們看看update語(yǔ)句是如何執(zhí)行的。sql語(yǔ)句如下:update tb_student A set where。張三,讓 s修改張三 年代。實(shí)際數(shù)據(jù)庫(kù)中肯定不會(huì)設(shè)置年齡字段,否則由技術(shù)負(fù)責(zé)人鍵入。其實(shí)這個(gè)語(yǔ)句基本會(huì)遵循上一次查詢(xún)的流程,但是在進(jìn)行更新的時(shí)候必須記錄日志,這就要引入日志模塊。MySQL和的日志模塊binlog(歸檔日志)可以被所有的存儲(chǔ)引擎使用,我們常用的InnoDB引擎也自帶了日志模塊redo log(重做日志),所以我們將在InnoDB模式下討論這條語(yǔ)句的執(zhí)行過(guò)程。流程如下:首先查詢(xún)張三的數(shù)據(jù),如果有緩存,也會(huì)使用。然后獲取查詢(xún)語(yǔ)句,把年齡改成19,然后調(diào)用引擎的API接口寫(xiě)這一行數(shù)據(jù)。InnoDB引擎將數(shù)據(jù)保存在內(nèi)存中,并記錄重做日志。此時(shí)重做日志進(jìn)入準(zhǔn)備狀態(tài),然后告訴執(zhí)行人執(zhí)行完成,可以隨時(shí)提交。收到通知后,執(zhí)行器記錄binlog,然后調(diào)用引擎接口,提交重做日志作為提交狀態(tài)。更新完成。這里肯定有同學(xué)會(huì)問(wèn),為什么要用兩個(gè)日志模塊,而不是一個(gè)日志模塊?這是因?yàn)镸ySQL沒(méi)有 t一開(kāi)始用InnoDB engine(InnoDB engine是其他公司作為插件插入MySQL的),MySQL 的引擎是MyISAM,但是我們知道重做日志是InnoDB引擎獨(dú)有的,其他存儲(chǔ)引擎都沒(méi)有。這樣一來(lái),就不會(huì)有崩潰安全的能力(即使數(shù)據(jù)庫(kù)非正常重啟,之前提交的記錄也不會(huì)丟失),binlog日志只能用于存檔。It 不是那樣的。;不可能只使用一個(gè)日志模塊,但是InnoDB引擎支持通過(guò)重做日志處理事務(wù)。然后,有些同學(xué)會(huì)問(wèn),我用兩個(gè)日志模塊,但是可以 不會(huì)這么復(fù)雜吧?為什么重做日志引入了準(zhǔn)備提交前狀態(tài)?這里我們用歸謬法來(lái)解釋為什么要這樣做。先寫(xiě)重做日志直接提交,再寫(xiě)binlog。假設(shè)寫(xiě)完重做日志后,機(jī)器掛起,binlog日志沒(méi)有寫(xiě),那么機(jī)器重啟后,機(jī)器會(huì)通過(guò)重做日志恢復(fù)數(shù)據(jù),但此時(shí)binlog沒(méi)有記錄數(shù)據(jù),所以后面?zhèn)浞輽C(jī)器時(shí)會(huì)丟失,同時(shí)主從同步也會(huì)丟失這些數(shù)據(jù)。首先寫(xiě)binlog,然后重做log。假設(shè)binlog完成,機(jī)器異常重啟。因?yàn)闆](méi)有重做日志,所以無(wú)法還原計(jì)算機(jī)。這篇文章是有記錄的,但是binlog有記錄,所以和上面一樣,數(shù)據(jù)會(huì)不一致。如果重做日志分兩個(gè)階段提交,會(huì)有所不同。編寫(xiě)binglog后,提交Redlog會(huì)防止上述問(wèn)題,從而保證數(shù)據(jù)的一致性。那么問(wèn)題來(lái)了。是否存在極端情況?假設(shè)重做日志處于提交前狀態(tài),binglog已經(jīng)完成。如果此時(shí)出現(xiàn)異常重啟會(huì)怎么樣?這個(gè)要看MySQL的處理機(jī)制,MySQL的處理過(guò)程是這樣的:判斷重做日志是否完整,如果完整,立即提交。如果重做日志只是預(yù)提交,而不是提交狀態(tài),此時(shí)會(huì)判斷binlog是否完整,如果完整就提交重做日志,如果不完整就回滾事務(wù)。這就解決了數(shù)據(jù)一致性的問(wèn)題。第三,MySQL主要分為服務(wù)器層和引擎層。服務(wù)器層主要包括連接器、查詢(xún)緩存、分析器、優(yōu)化器和執(zhí)行器,還有一個(gè)日志模塊(binlog),所有執(zhí)行引擎都可以共享,redolog只有InnoDB才有。引擎層是插件,主要包括MyISAM、InnoDB、Memory等等。查詢(xún)語(yǔ)句的執(zhí)行流程如下:權(quán)限檢查(如果命中緩存)-查詢(xún)緩存-分析器-優(yōu)化器-權(quán)限檢查-執(zhí)行器。引擎更新語(yǔ)句的執(zhí)行流程如下:分析器-權(quán)限檢查-執(zhí)行器。