知識整理(三) Mysql 資料庫知識

2021-10-05 06:12:12 字數 3579 閱讀 9793

1. myisam和innodb的區別?

答:myisam不支援事務和行級鎖,而且其最大的缺陷在於資料庫崩潰後無法安全恢復。

2. 事務的四大特性

答:acid

①原子性:事務是最小執行單元,要麼全部成功,要麼全部失敗。

②一致性:事務改變的資料,前後要一致。

③隔離性:併發操作時,當乙個事務在執行時,外界無法操作它。

④永續性:一旦乙個事務執行成功,它對資料庫的操作是永久性的,即使資料庫發生崩潰,資料也不會改變。

3. 併發事務會帶來哪些問題?

答:① 髒讀:當事務a在對某條資料做修改時,還沒有儲存到資料庫中,恰好此時事務b讀取了這條資料,這就是髒資料,以髒資料為標準做的操作可能並不正確。

② 丟失修改:當事務a對資料a(值為20)進行a=a-1操作,還沒存入資料庫時,事務b也對資料a(值為20)進行a=a-1操作,然後事務a和事務b相繼儲存到資料庫,最終資料a的值為19,事務a的操作丟失了。

③ 不可重複讀:當事務a在對資料b(值為100)進行每次遞減1的操作時,事務b開始讀取資料b的值,結果發現每次讀到的值並不一樣,這就是不可重複讀。

④ 幻讀:當事務a在新增資料時,事務b在查詢,結果發現每次查詢的資料都會多出來幾條,以為自己出現了幻覺,這就是幻讀。

注:不可重複讀和幻讀很相似,但是區別在於:不可重複讀重點在於關注單條資料的變化,而幻讀的重點在於關注突然新增或減少了幾條資料。

4. 事務隔離級別有哪些?

答:① 讀 - 未提交:最低的隔離級別,可以讀取未提交的資料,可能會引起髒讀、不可重複讀和幻讀。

② 讀 - 已提交:可以讀取已經提交的資料,可能會引起不可重複讀和幻讀。

③ 可重複讀:在乙個事務內,多次讀取同乙個字段,其值始終一樣,除非該事務自己修改了字段的值,可能會引起幻讀。

④ 序列化:最高的隔離級別,完全遵循acid原則,可以防止髒讀、不可重複讀和幻讀。

注:隔離級別越低,請求的鎖就越少,效能也就越快。

5. mysql的預設隔離級別是?答:

通過命令:

select @@tx_isolation

;

可知,是可重複讀。

注1:與sql標準不同的是,innodb雖然是可重複讀的隔離級別,但是其採用了next-key lock演算法,可以避免幻讀的出現,即達到了sql的序列化隔離級別。

注2:innodb儲存引擎在分布式事務中一般會採用序列化的隔離級別。

6. myisam和innodb儲存引擎使用的鎖:

答:myisam預設使用表級鎖。innodb預設使用行級鎖,也支援表級鎖。

7. 大表怎麼優化?

答:① 限定資料範圍:比如我們查訂單表的時候,限制必須傳入查詢條件,如只能查詢近乙個月的訂單。

② 讀寫分離:經典的方案,主庫負責寫,從庫負責讀。

③ 垂直分割槽:比如,使用者錶可分為使用者資訊表和使用者登入表。

④ 水平分割槽:利用mycat等一些中介軟體做集群。

8. mysql的基本架構

答:包含server層和儲存引擎。

sever層包括:

儲存引擎:負責資料儲存和讀取。採用可替換的外掛程式式架構,支援myisam、innodb、memory等多種儲存引擎,innodb自帶乙個redolog日誌模組。

9. 一條sql的執行過程

答:分兩種情況:查詢的sql和增、改、刪的sql。

10. 索引的優點那麼多,為什麼不對每乙個欄位都建立索引呢?

答:① 當對表中的索引字段進行修改時,索引也要動態的維護。

② 索引會占用物理空間。

③ 建立索引和維護索引需要時間,這個時間會隨著資料量的增加而增加。

11. 使用索引的注意事項

答:① 索引加在經常作為搜尋內容的字段上,可以加快搜尋速度。

② 索引加在where字句的搜尋條件欄位上,可以加快條件的判斷速度。

③ 索引加在經常需要排序的字段上,可以加快排序速度,因為索引自帶排序。

④ 索引加在經常需要連線其他表的外來鍵字段上,可以加快連線速度。

⑤ 刪除長期未使用的索引。空置的索引也會造成效能的損耗,具體可以查詢sys 庫的 chema_unused_indexes 檢視來查詢哪些索引從未被使用

⑥ 在使用limit offset時新增索引,可以提公升速度。

12. mysql索引主要使用的兩種資料結構

答:雜湊索引和btree索引。

雜湊索引主要用於查詢單條記錄,效能最佳,其餘場景建議選用btree索引。

根據儲存引擎的不同,myisam使用的是btree索引中的非聚簇索引,其特點是索引和資料分離。

而innodb使用的是聚簇索引(分為主索引和輔助索引),其索引和資料本就是一體。使用主索引查詢時,可以直接根據key獲得資料。根據輔助索引查詢時,需要先取出主鍵的值,再走一遍主索引,稱為「回表」。

13. 什麼是覆蓋索引?

答:索引的字段和要查詢的字段完全一致,就是覆蓋索引,因為不用回表,所以它的速度很快。如下:

select username, age from t_user where username =

'wxj'

and age =

26

username和age欄位都是索引字段,而且查詢的內容也是它倆,所以這個是覆蓋索引。

14. mysql的基本儲存結構答:

15. 使用索引為什麼會加快速度?

答:當執行一條沒有加過索引的查詢sql時,

select

*from t_user where username =

'wxj'

具體過程如下:

① 遍歷雙鏈表,找到該條記錄所在的資料頁。

② 遍歷單鏈表,找到此資料頁中的該條記錄。

使用索引後,我們不需要遍歷雙鏈表,只用通過索引這個「目錄」,就能快速地定位到該資料頁。

索引就是將無序變得有序了。

16. 索引的最左字首原則

答:mysql中的索引可以引用多個,如index_name(name,city),這就是乙個聯合索引。

最左字首原則是指,在使用聯合索引作為條件查詢時,只有查詢條件精確匹配到左邊的一列或多列時,聯合索引才生效。

舉例如下:

這是乙個聯合索引:index_name(username, age)

// 可以命中索引

select

*from t_user where username =

'wxj'

and age =

26// 可以命中索引

select

*from t_user where username =

'wxj'

// 可以命中索引

select

*from t_user where age =

26and username =

'wxj'

// 無法命中索引

select

*from t_user where age =

26

mysql 資料庫知識整理

資料庫索引b 數,hash b 數是乙個平衡大多叉樹,搜尋效率基本相當 雜湊索引 採用一定的雜湊演算法,把鍵值換成新的雜湊值,檢索時不需要類似b 1 所有的非葉子節點只儲存關鍵字資訊。2 所有衛星資料 具體資料 都存在葉子結點中。3 所有的葉子結點中包含了全部元素的資訊。4 所有葉子節點之間都有乙個...

資料庫相關知識整理(三)

start transaction 一條或多條sql語句 commit 其中start transaction標識事務開始,commit提交事務,將執行結果寫入到資料庫。如果sql語句執行出現問題,會呼叫rollback,回滾所有已經執行成功的sql語句。當然,也可以在事務中直接使用rollback...

資料庫知識整理(一)

檢視 view 是從乙個或多個表 或 檢視 匯出的表。檢視與表 有時為與檢視區別,也稱表為基本表 base table 不同,檢視是乙個虛表,即檢視所對應的資料不進行實際儲存,資料庫中只儲存檢視的定義,在對檢視的資料進行操作時,系統根據檢視的定義去操作與檢視相關聯的基本表。建立檢視 create v...