mysql資料庫答題 資料庫答題

2021-10-19 02:09:02 字數 3703 閱讀 1322

資料庫原理:就是將所要儲存的資料,寫入文字檔案。這個文字檔案就是你的資料庫。這些檔案以mysql的innodb來說是以b+數的方式儲存的資料集合。也就是:儲存有組織資料的容器

索引原理:引(index)是幫助mysql高效獲取資料的資料結構。mysql的索引資料結構就是b+樹,

對比平衡二叉樹:資料檔案是存在硬碟檔案中的,使用的時候需要載入進記憶體裡面,當資料量太大的時候,不可能把全部資料都載入在記憶體,所有每次只能比較相鄰節點的話,如果元素數量非常多的話,這樣導致二叉查詢樹結構由於樹的深度過大而造成磁碟i/o讀寫過於頻繁,進而導致查詢效率低下

樹的好處和b-樹的對比:

1, b樹與紅黑樹最大的不同在於,b樹的結點可以有許多關鍵字,這樣可以降低樹的高度,減少io操作

2,由於b+樹的內部節點只存放主鍵因此,這樣乙個頁中,儲存的索引就會比較多,一次讀取,可以在記憶體頁中獲取更多的主鍵,相對來說io讀寫次數也就降低了

3,b+樹的葉節點由一條鏈相連,因此,當需要進行一次資料遍歷的時候,b+樹只需要使用o(logn)時間找到最小的乙個節點,然後通過鏈進行o(n)的順序遍歷即可。limit操作

4,非葉子節點不放資料,每個關鍵字都要走一次根到子節點的路徑,查詢效率會比較穩定

底層:用16kb的頁來儲存資料,頁頭兩端都有指標,形成乙個雙向鍊錶的頁的鍊錶,每乙個頁可以存4種記錄,主索引樹非葉節點,主索引樹葉子節點,輔助索引樹葉子節點,輔助索引樹非葉節點。主索引樹非葉節點主要有, 節點儲存的索引值,

索引值對應的頁的編號,作用是定位那條記錄,找到對應的頁後,對於頁內的資料都是按照主鍵採用遞增的排序,通常使用二分查詢法每次把查詢空間縮小一半。

對比輔助索引:基本和主鍵索引一場,輔助索引樹非葉節點的值儲存的是主鍵值,用來在主索引樹里再做一次b+樹檢索來找到整條記錄。

索引具體使用:

unique唯一索引:不可以出現相同的值,可以有null值

index普通索引:允許出現相同的索引內容

primary key主鍵索引:不允許出現相同的值,且不能為null值,乙個表只能有乙個primary_key索引

建立索引的必要:

1,索引的選擇性較低。是指不重複的索引值在表中很少一部分的時候,比如性別,地區,這些可選值範圍很小的時候不需要加

2,對 where,on,group by,order by **現的列使用索引,mysql只對,>=,between,in,以及某些時候的like才會使用索引。

3,對較小的資料列使用索引,這樣會使索引檔案更小,同時記憶體中也可以裝載更多的索引鍵

4,為較長的字串使用字首索引

如果索引列長度過長,這種列索引時將會產生很大的索引檔案,不便於操作,可以使用字首索引方式進行索引字首索引應該控制在乙個合適的點,比如每個長度為10單詞作為索引,但實際上可能前3個或者4個已經可以判斷出,所以只需要在字首字段新增索引,減少                   索引的大小,一次能在載入更多的索引在記憶體裡面。

5,使用組合索引,可以減少檔案索引大小,在使用時速度要優於多個單列索引

聯合索引,a,b,c相當於建立了a,b,c      a,b    a三個索引,mysql 組合索引"最左字首"的原則。聯合索引a,b,c從左到右進行索引,如果沒有左前索引mysql不執行索引查詢

不使用索引的情況:1,因為所有索引列參與了計算,2like "%後盾%" -- like前面字串是萬用字元的情況不走索引,3,字串與數字比較不使用索引;用union和in替換or

事務的acid

1、原子性(atomicity):整個資料庫事務是不可分割的工作單位。乙個事物內所有操作共同組成乙個原子包,要麼全部成功,要麼全部失敗。

2、一致性(consistency):所謂的一致性是基於原子性。原子性只保證了乙個事物內的所有操作同一性,不會出現你完成,我還未完成。但是,原子性並沒***大家同一時刻一起完成,計算機指令是有先後順序的,這樣就決定了乙個事物的提交,會經歷乙個時間過程,那麼如果事物提交進行到了一半,讀取了資料庫,會不會讀到中間結果?為了防止這樣的情況,資料庫事物的一致性就規了事物提交前後,永遠只可能存在事物提交前的狀態和事物提交後的狀態,從乙個一致性的狀態到另乙個一致性狀態,而不可能出現中間的過程態。

3、隔離性(isolation):事務的隔離性,基於原子性和一致性,每個事務互不干擾。這樣每個事務都感覺不到有其他事務在併發地執行。

4、永續性(durability):當乙個事物提交之後,資料庫狀態永遠的發生了改變,這個事物只要提交了,哪怕提交後宕機,他也確確實實的提交了。

事務的併發問題

1、髒讀:事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料

2、不可重複讀:事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。

針對當前讀,rr隔離級別保證對讀取到的記錄加鎖 (記錄鎖),同時保證對讀取的範圍加鎖,新的滿足查詢條件的記錄不能夠插入 (間隙鎖),不存在幻讀現象。

3、幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

mysql事務隔離級別

事務隔離級別

髒讀不可重複讀

幻讀讀未提交(read-uncommitted)是是

是不可重複讀(read-committed)否是

是可重複讀(repeatable-read)否否

是序列化(serializable)否否

否併發下的索引加鎖:

mvcc(multiversion concurrency control),即多版本併發控制技術,快照讀,當前讀:讀不加鎖,讀寫不衝突。讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read)。快照讀,讀取的是記錄的可見版本 (有可能是歷史版本),不用加鎖。當前讀,讀取的是記錄的最新版本,並且,當前讀返回的記錄,都會加上鎖,保證其他事務不會再併發修改這條記錄。

快照讀:簡單的select操作,不會對資料庫加鎖,如果其他事務正進行的delete,update操作,這時的快照讀也不等待鎖的釋放,再read commited事務隔離級別中,會讀取被鎖前最新的版本的資料,再repeated read事務隔離級別中,會讀取事務開始時版本的資料

當前讀:select ....lock in share mode加s鎖,select ....for update加x鎖

鎖的演算法:innodb主要使用行鎖和間隙鎖,在查詢的字段有使用主鍵索引和唯一索引的時候,如果使用等值條件,a=1,由於他的唯一性,不可能再新增同樣的資料,基本只使用行鎖,在索引是非唯一索引的時候,或者是帶有範圍的時候(select * from table id < 6)小於6和6的區間被加了間隙鎖和行鎖,insert 小於6的操作會被阻塞,除了6以上

詳盡解釋:

死鎖:a,b事務併發情況下,a把id=1鎖了,b把id=2鎖了,b再去查詢id=1,a再去查詢id=2,兩個事務互相等待,mysql丟擲超時異常,b事務回滾,a事務得到資源

資料庫簡答題(2)

簡答題 假設有如下實體 學生 學號 姓名 性別 年齡 課程 課程編號 課程名 教師 教師號 姓名 性別 職稱 單位 單位名稱 上述實體中存在如下聯絡 乙個學生可選修多門課程,一門課程可為多個學生選修 乙個教師可講授多門課程,一門課程可為多個教師講授 乙個單位可有多個教師,乙個教師只能屬於乙個單位 乙...

譽天丨oracle資料庫知識答題

1.下列關於還原與恢復說法正確的是?d a.非歸檔模式下,無法還原資料庫 b.非歸檔模式下,可以還原資料庫,也可以恢復資料庫 c.歸檔模式下,只能還原資料庫,無法恢復資料庫 d.歸檔模式下,既可以還原資料庫,也可以恢復資料庫 2.基於使用者管理的備份,說法正確的是?bd a.不用關閉資料庫,直接底層...

mysql資料庫效能資料 MYSQL資料庫效能優化

1.選取最適用的字段屬性 表中字段的寬度設得盡可能小 char 的上限為 255 位元組 固定占用空間 varchar 的上限 65535 位元組 實際占用空間 text 的上限為 65535。盡量把字段設定為 not null,執行查詢的時候,資料庫不用去比較 null 值。2.使用連線 join...