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

評論