10、drop、delete與truncate的區(qū)別
SQL中的drop、delete、truncate都表示刪除,但是三者有一些差別:
-
Delete用來刪除表的全部或者一部分?jǐn)?shù)據(jù)行,執(zhí)行delete之后,用戶需要提交(commmit)或者回滾(rollback)來執(zhí)行刪除或者撤銷刪除, delete命令會觸發(fā)這個表上所有的delete觸發(fā)器。
-
Truncate刪除表中的所有數(shù)據(jù),這個操作不能回滾,也不會觸發(fā)這個表上的觸發(fā)器,TRUNCATE比delete更快,占用的空間更小。
-
Drop命令從數(shù)據(jù)庫中刪除表,所有的數(shù)據(jù)行,索引和權(quán)限也會被刪除,所有的DML觸發(fā)器也不會被觸發(fā),這個命令也不能回滾。
因此,在不再需要一張表的時候,用drop;在想刪除部分?jǐn)?shù)據(jù)行時候,用delete;在保留表而刪除所有數(shù)據(jù)的時候用truncate。
11、Sql的優(yōu)化
- sql盡量使用索引,而且查詢要走索引
- 對sql語句優(yōu)化
子查詢變成left join
limit 分布優(yōu)化,先利用ID定位,再分頁
or條件優(yōu)化,多個or條件可以用union all對結(jié)果進(jìn)行合并(union all結(jié)果可能重復(fù))
不必要的排序
where代替having,having 檢索完所有記錄,才進(jìn)行過濾
避免嵌套查詢
對多個字段進(jìn)行等值查詢時,聯(lián)合索引
12、關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫區(qū)別
12.1、關(guān)系型數(shù)據(jù)庫
- 優(yōu)點
- 容易理解:二維表結(jié)構(gòu)是非常貼近邏輯世界一個概念,關(guān)系模型相對網(wǎng)狀、層次等其他模型來說更容易理解。
- 使用方便:通用的SQL語言使得操作關(guān)系型數(shù)據(jù)庫非常方便。
- 易于維護(hù):豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數(shù)據(jù)冗余和數(shù)據(jù)不一致的概率。
- 支持SQL,可用于復(fù)雜的查詢。
- 支持事務(wù) 。
- 缺點
- 為了維護(hù)一致性所付出的巨大代價就是其讀寫性能比較差;
- 固定的表結(jié)構(gòu);
- 不支持高并發(fā)讀寫需求;
- 不支持海量數(shù)據(jù)的高效率讀寫
12.2、非關(guān)系型數(shù)據(jù)庫
- 使用鍵值對存儲數(shù)據(jù);
- 分布式;
- 優(yōu)點
- 無需經(jīng)過sql層的解析,讀寫性能很高
- 基于鍵值對,數(shù)據(jù)沒有耦合性,容易擴(kuò)展
- 存儲數(shù)據(jù)的格式:nosql的存儲格式是key,value形式
- 缺點
- 不提供sql支持
13、臟讀,不可重讀,幻讀
-
臟讀:臟讀是指一個事務(wù)在處理過程中讀取了另一個還沒提交的事務(wù)的數(shù)據(jù)。
比如A向B轉(zhuǎn)賬100,A的賬戶減少了100,而B的賬戶還沒來得及修改,此時一個并發(fā)的事務(wù)訪問到了B的賬戶,就是臟讀 。
-
不可重復(fù)讀:不可重復(fù)讀是對于數(shù)據(jù)庫中的某一個字段,一個事務(wù)多次查詢卻返回了不同的值,這是由于在查詢的間隔中,該字段被另一個事務(wù)修改并提交了。
比如第一次查詢自己的賬戶有1000元,此時另一個事務(wù)給A的賬戶增加了1000元,所以A再次讀取他的賬戶得到了2000的結(jié)果,跟第一次讀取的不一樣。
不可重復(fù)讀與臟讀的不同之處在于,臟讀是讀取了另一個事務(wù)沒有提交的臟數(shù)據(jù),不可重復(fù)讀是讀取了已經(jīng)提交的數(shù)據(jù),實際上并不是一個異?,F(xiàn)象。 -
幻讀:事務(wù)多次讀取同一個范圍的時候,查詢結(jié)果的記錄數(shù)不一樣,這是由于在查詢的間隔中,另一個事務(wù)新增或刪除了數(shù)據(jù)。
比如A公司一共有100個人,第一次查詢總?cè)藬?shù)得到100條記錄,此時另一個事務(wù)新增了一個人,所以下一次查詢得到101條記錄。
不可重復(fù)度和幻讀的不同之處在于,幻讀是多次讀取的結(jié)果行數(shù)不同,不可重復(fù)度是讀取結(jié)果的值不同。
避免不可重復(fù)讀需要鎖行,避免幻讀則需要鎖表。
臟讀,不可重復(fù)讀和幻讀都是數(shù)據(jù)庫的讀一致性問題,是在并行的過程中出現(xiàn)的問題,必須采用一定的隔離級別解決。
二、數(shù)據(jù)庫進(jìn)階
1、MySQL的主從復(fù)制
MySQL主從復(fù)制是其最重要的功能之一。主從復(fù)制是指一臺服務(wù)器充當(dāng)主數(shù)據(jù)庫服務(wù)器,另一臺或多臺服務(wù)器充當(dāng)從數(shù)據(jù)庫服務(wù)器,主服務(wù)器中的數(shù)據(jù)自動復(fù)制到從服務(wù)器之中。對于多級復(fù)制,數(shù)據(jù)庫服務(wù)器即可充當(dāng)主機(jī),也可充當(dāng)從機(jī)。MySQL主從復(fù)制的基礎(chǔ)是主服務(wù)器對數(shù)據(jù)庫修改記錄二進(jìn)制日志,從服務(wù)器通過主服務(wù)器的二進(jìn)制日志自動執(zhí)行更新。
MySQL主從復(fù)制的兩種情況: 同步復(fù)制和異步復(fù)制 ,實際復(fù)制架構(gòu)中大部分為異步復(fù)制。
復(fù)制的基本過程如下:
- Slave上面的IO進(jìn)程連接上Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內(nèi)容。
- Master接收到來自Slave的IO進(jìn)程的請求后,負(fù)責(zé)復(fù)制的IO進(jìn)程會根據(jù)請求信息讀取日志指定位置之后的日志信息,返回給Slave的IO進(jìn)程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經(jīng)到Master端的bin-log文件的名稱以及bin-log的位置。
- Slave的IO進(jìn)程接收到信息后,將接收到的日志內(nèi)容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的 bin-log的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴Master“我需要從某個bin-log的哪個位置開始往后的日志內(nèi)容,請發(fā)給我”。
- Slave的Sql進(jìn)程檢測到relay-log中新增加了內(nèi)容后,會馬上解析relay-log的內(nèi)容成為在Master端真實執(zhí)行時候的那些可執(zhí)行的內(nèi)容,并在自身執(zhí)行。
2、數(shù)據(jù)庫水平切分與垂直切分
- 垂直拆分就是要把表按模塊劃分到不同數(shù)據(jù)庫表中(當(dāng)然原則還是不破壞第三范式),這種拆分在大型網(wǎng)站的演變過程中是很常見的。當(dāng)一個網(wǎng)站還在很小的時候,只有小量的人來開發(fā)和維護(hù),各模塊和表都在一起,當(dāng)網(wǎng)站不斷豐富和壯大的時候,也會變成多個子系統(tǒng)來支撐,這時就有按模塊和功能把表劃分出來的需求。其實,相對于垂直切分更進(jìn)一步的是服務(wù)化改造,說得簡單就是要把原來強(qiáng)耦合的系統(tǒng)拆分成多個弱耦合的服務(wù),通過服務(wù)間的調(diào)用來滿足業(yè)務(wù)需求看,因此表拆出來后要通過服務(wù)的形式暴露出去,而不是直接調(diào)用不同模塊的表,淘寶在架構(gòu)不斷演變過程,最重要的一環(huán)就是服務(wù)化改造,把用戶、交易、店鋪、寶貝這些核心的概念抽取成獨立的服務(wù),也非常有利于進(jìn)行局部的優(yōu)化和治理,保障核心模塊的穩(wěn)定性。
垂直拆分:單表大數(shù)據(jù)量依然存在性能瓶頸。 - 水平拆分,上面談到垂直切分只是把表按模塊劃分到不同數(shù)據(jù)庫,但沒有解決單表大數(shù)據(jù)量的問題,而水平切分就是要把一個表按照某種規(guī)則把數(shù)據(jù)劃分到不同表或數(shù)據(jù)庫里。例如像計費系統(tǒng),通過按時間來劃分表就比較合適,因為系統(tǒng)都是處理某一時間段的數(shù)據(jù)。而像SaaS應(yīng)用,通過按用戶維度來劃分?jǐn)?shù)據(jù)比較合適,因為用戶與用戶之間的隔離的,一般不存在處理多個用戶數(shù)據(jù)的情況,簡單的按user_id范圍來水平切分。
- 通俗理解:水平拆分行,行數(shù)據(jù)拆分到不同表中, 垂直拆分列,表數(shù)據(jù)拆分到不同表中。
3、數(shù)據(jù)庫高并發(fā)的解決方案
- 在web服務(wù)框架中加入緩存。在服務(wù)器與數(shù)據(jù)庫層之間加入緩存層,將高頻訪問的數(shù)據(jù)存入緩存中,減少數(shù)據(jù)庫的讀取負(fù)擔(dān)。
- 增加數(shù)據(jù)庫索引。提高查詢速度。(不過索引太多會導(dǎo)致速度變慢,并且數(shù)據(jù)庫的寫入會導(dǎo)致索引的更新,也會導(dǎo)致速度變慢)
- 主從讀寫分離,讓主服務(wù)器負(fù)責(zé)寫,從服務(wù)器負(fù)責(zé)讀。
- 將數(shù)據(jù)庫進(jìn)行拆分,使得數(shù)據(jù)庫的表盡可能小,提高查詢的速度。
- 使用分布式架構(gòu),分散計算壓力。
4、什么是存儲過程?有哪些優(yōu)缺點?
存儲過程是事先經(jīng)過編譯并存儲在數(shù)據(jù)庫中的一段SQL語句的集合。進(jìn)一步地說,存儲過程是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法一樣實現(xiàn)一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候調(diào)用他就行了。
存儲過程具有以下特點:
- 存儲過程只在創(chuàng)建時進(jìn)行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般 SQL 語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行效率。
- 當(dāng)SQL語句有變動時,可以只修改數(shù)據(jù)庫中的存儲過程而不必修改代碼。
- 減少網(wǎng)絡(luò)傳輸,在客戶端調(diào)用一個存儲過程當(dāng)然比執(zhí)行一串SQL傳輸?shù)臄?shù)據(jù)量要小。
- 通過存儲過程能夠使沒有權(quán)限的用戶在控制之下間接地存取數(shù)據(jù)庫,從而確保數(shù)據(jù)的安全。
5、視圖?游標(biāo)?
- 視圖是一種虛擬的表,通常是有一個表或者多個表的行或列的子集,具有和物理表相同的功能,可以對視圖進(jìn)行增,刪,改,查等操作。特別地,對視圖的修改不影響基本表。相比多表查詢,它使得我們獲取數(shù)據(jù)更容易。
- 游標(biāo)是對查詢出來的結(jié)果集作為一個單元來有效的處理。游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行??梢詫Y(jié)果集當(dāng)前行做修改。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時候,游標(biāo)顯得十分重要。
- 在操作mysql的時候,我們知道MySQL檢索操作返回一組稱為結(jié)果集的行。這組返回的行都是與SQL語句相匹配的行(零行或多行)。使用簡單的 SELECT語句,例如,沒有辦法得到第一行、下一行或前 10行,也不存在每次一行地處理所有行的簡單方法(相對于成批地處理它們)。有時,需要在檢索出來的行中前進(jìn)或后退一行或多行。這就是使用游標(biāo)的原因。游標(biāo)(cursor)是一個存儲在MySQL服務(wù)器上的數(shù)據(jù)庫查詢,它不是一條 SELECT語句,而是被該語句檢索出來的結(jié)果集。在存儲了游標(biāo)之后,應(yīng)用程序可以根據(jù)需要滾動或瀏覽其中的數(shù)據(jù)。游標(biāo)主要用于交互式應(yīng)用,其中用戶需要滾動屏幕上的數(shù)據(jù),并對數(shù)據(jù)進(jìn)行瀏覽或做出更改。
6、超鍵 候選鍵 主鍵 外鍵
- 超鍵: 在關(guān)系中能唯一標(biāo)識元組(數(shù)據(jù)庫中的一條記錄)的屬性集稱為關(guān)系模式的超鍵。一個屬性可以作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選鍵和主鍵。
- 候選鍵: 是最小超鍵,即沒有冗余元素的超鍵。
- 主鍵: 數(shù)據(jù)庫表中對儲存數(shù)據(jù)對象予以唯一和完整標(biāo)識的數(shù)據(jù)列或?qū)傩缘慕M合,用戶選作元組標(biāo)識的一個侯選鍵稱為主鍵。一個數(shù)據(jù)列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
- 外鍵: 在一個表中存在的另一個表的主鍵稱此表的外鍵,外鍵主要是用來描述兩個表的關(guān)系。
-
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3839瀏覽量
64543 -
計算機(jī)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
3文章
341瀏覽量
22200 -
MySQL
+關(guān)注
關(guān)注
1文章
819瀏覽量
26651
發(fā)布評論請先 登錄
相關(guān)推薦
評論