1 主鍵索引和唯一索引的區別?
mysql索引有:
| 索引型別 | 特點 |
| 1 主鍵索引 | 非空唯一索引,一個表只有一個主鍵索引,primary key('name') |
| 2 唯一索引 | 可以有一個null值,但不可以有相同 |
| 3 普通索引 |
允許出現相同 |
|
4 組合索引 |
多個key組成的索引 |
|
5 全文索引 |
倒排索引,前面四個都是正排索引, |
innodb主鍵索引是怎么創建的呢?分為幾種情況:
- 如果使用了primary key,就是主鍵索引,
- 如果沒有primary key,則從非空唯一索引中選擇,從上往下選擇第一個,
- 如果前兩種都沒創建,就自動生成一個主鍵索引,rowid作為主鍵
由于1到4這四種索引都會在內部自動創建B+樹,但是這個B+樹有不同區別,
- 主鍵索引對應的B+樹,是一個聚集索引,葉子節點包含行資料,
- 其他3種索引對應的B+樹,都是輔助索引,包含的只有比較key欄位,還有bookmark(書簽),書簽中存盤主鍵id,如果輔助索引中沒有需要的資訊,則要通過主鍵id去查聚集索引,得到行資料(select * from T where name =xx),如果從輔助索引中能得到需要的資訊,則不需要再通過聚集索引查找(id 為主鍵id ,select id, name from T where name =xx),
答案:
- 主鍵索引 非空唯一,唯一索引允許為空唯一
- 主鍵索引可能從唯一索引中進行選取
- 主鍵索引對應的B+樹包含完整行資訊,唯一索引對應的B+樹只包含key和主鍵id,
2 什么是覆寫索引?原理是什么?
覆寫索引:
主要是指輔助索引B+樹,從輔助索引中就能找到資料,而不需要通過聚集索引查找,
在專案開發程序中,我們會發現很少有查詢select * from T where name =xx的情況,通常通過索引
查詢主鍵id select id, name from T where name =xx,
原理:
盡量匹配輔助索引的資料,減少回表查詢,
輔助索引包含的資訊少,頁中能容納的資料多,樹的高度會矮一些,有更少的磁盤io,
3 什么是回表插敘?原理是什么?
當一個查詢陳述句中where條件匹配的是輔助索引B+樹,但是select中的欄位,有些沒有在輔助索引
B+樹中,就需要通過主鍵id再去聚集索引中查詢行資訊,這個通過主鍵id再去聚集索引中查詢資料
的程序,就叫回表查詢,
4 什么是索引下推?原理是什么?
索引下推:是mysql內部優化,mysq 5.6 才有,有時候也叫索引條件下推(index condition
pushdown)
原理:在使用輔助索引進行查詢時,將查詢條件也推送給聚集索引進行查詢,減少回表次數,
講解案例:
一張表有 欄位:id, name, height,age
組合索引 (height, age)
查詢:select * from table where height =180 and age >17;
mysql內部在查詢時會先通過height =180進行輔助索引查詢,假設查到4條資料,因為select * 要查
詢全部資料,在未使用索引下推時,還需要查詢通過主鍵id去查詢四次主鍵索引B+樹獲取息,若使
用索引下推,會把age >17的條件也下推給存盤引擎,只做一次主鍵索引的回表查詢,
5 資料庫事務的四個特性及含義?
需要資料庫事務的前提:通常有多個連接與資料庫建立連接,mysql內部會有一個主執行緒,它用來
監聽連接建立,當每條連接建立時,它會為這條連接建立獨立的連接執行緒,在每個連接執行緒中
都獨自執行sql陳述句,mysql內部實際上是多執行緒并發處理連接命令,
事務的定義:用戶定義的操作序列,通俗的說多條sql陳述句,
事務四個特性:
原子性:事務操作要么都做(提交),要么都不做(回滾),undolog 來實作逆操作回滾,
隔離性:在通常代碼編程中會加互斥鎖、讀寫鎖,會造成串行執行,在mysql中不允許,因為會造
成性能降低,mysql是采用制定隔離級別來實作,隔離級別是描述各個事務之間相互的影響程
度,設計不同的隔離級別,主要用來提升并發性能,隔離級別會用到一些技術,比如MVCC 非
鎖定一致讀,即讀不加鎖,寫加鎖,
持久性:事務一旦完成,要將資料所做的變更記錄下來,redolog 來記錄,append的方式追加記錄
操作日志,
一致性:不能違反資料的一致性檢測(完整約束檢測),
6 不可重復讀與幻讀的區別?
需要先了解隔離級別:
| 隔離級別 | 特點 |
| read uncommited | 讀不加鎖,也不用MVCC,就寫加鎖了 |
| read commited | 使用mvcc機制,只讀最新版本資訊,寫加鎖(排他鎖) |
| repeatable read |
讀操作也使用mvcc,讀事務開始前的版本寫也加鎖(間隙鎖), mvcc主要是快照讀、當前讀, 也可以在事務中做當前讀,例如洗掉、更新、新增, 也可以在sql陳述句加鎖讀: select * from t where ... for update; x鎖 select * from t where... lock in share mode; s鎖 |
| serializable | 讀寫都加鎖 |
在read commited中會出現不可重復讀和幻讀兩種例外情況,
在repeatable read中只會出現幻讀例外,
造成這兩個例外的原因是:因為讀未加鎖,造成例外讀的問題,
不可重復讀和幻讀的共同點:
兩次讀產生的資料不一致,
不可重復讀和幻讀不同點:
| 例外情況 | 現象 | 原因 |
| 不可重復讀 | 在某一行中兩次都不一致 | 永遠讀最新的資訊,如果另一個事務修改提交了,兩次讀會結果不一樣, |
| 幻讀 | 兩次資料結果集不同 |
快照讀和當前讀所造成, 例如: select * from t where id=3; 發現沒有資料后插入id=3的一行資料: insert (3....) select 陳述句是使用的快照讀,insert陳述句是新增資料,使用的是當前讀,(擴展下:為什么insert是寫操作,用的是當前讀呢?因為mysql用的是就地更新,要進行增刪改的前提需要先找到行的資料,在找的程序就是讀的行為,這個時候就用的是當前讀,) |
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/538259.html
標籤:MySQL
