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...