如何設計乙個關係型資料庫(鎖,索引)

2021-10-25 06:45:27 字數 2009 閱讀 2083

目錄

一.為什麼要使用索引?

二.什麼樣的資訊能成為索引?

三.索引的資料結構?

關於鎖1.myisam和innodb關於鎖方面的區別是什麼?

2.資料庫事務的四大特性

3.事務隔離級別以及各級別下的併發訪問問題

4.inodb可重複讀隔離級別下如何避免幻讀?

5.rc、rr級別下的innodb的非阻塞讀如何實現?

資料庫最終的是儲存。所以首要的是乙個儲存模組(檔案系統),可以存在在機械硬碟或者是固態硬碟,光有儲存不行,得需要乙個程式例項組織這些資料才能使用。所以大方向下分為儲存和程式例項。

關於程式例項,其實和做的專案一樣,也許對功能進行劃分。

首先需要對資料的格式以及檔案的分個進行統一的管理,即把物理資料通過邏輯的形式來表示出來,這一功能劃分為儲存管理

為了更好的優化程式,引入快取機制,把取出來的資料存放在快取裡,下次需要的時候,直接從記憶體返回。

需要提供給外界指令可以操作我們的資料庫,所以需要sql解析模組。

做的sql操作需要記錄下來,方便做主從同步或者災難恢復,因此需要有日誌管理辦法來記錄操作。

再者,需要給使用者管理資料的私密空間,即許可權劃分

設計系統除了考慮正常的功能,還需要考慮異常的功能,該如何恢復,所以需要引入容災機制

為了進一步提高查詢的速度,以及支援併發,需要引入最為重要的兩個模組:索引管理(提高查詢)鎖管理(支援併發)

關於索引

快速查詢資料

主鍵、唯一鍵、普通鍵

二叉樹查詢樹進行二分查詢

建立b-tree結構

建立b+-tree結構(mysql)

索引是建立越多越好嗎?

資料量小的表不需要建立索引,建立索引會增加額外的開銷,索引也是一些儲存在磁碟上的資料。

資料變更需要維護索引,更多的索引意味著更多的維護成本,也意味著需要更多的空間。

myisam預設用的是表級鎖,不支援行級鎖

innodb預設支援的是行級鎖,也支援表級鎖

關於myisam:假設有一條select語句a對資料庫操作需要十秒鐘,此時如果有另外一條語句b想要更新某一行(即使不在select的範圍鐘),那麼b語句會等待a語句執行完畢之後再執行,這就是myisam的表級鎖。其原理是,當執行select的時候,會對錶加乙個讀鎖,而對資料進行增刪改的時候,會對錶加乙個寫鎖,當讀鎖未被釋放的時候,另外乙個訪問想要增加寫鎖就會被阻塞,直到所有的讀鎖被釋放。可以使用lock tables [table_name] read;手動給表增加讀鎖,使用unlock tables;可以解鎖。

讀鎖也稱為共享鎖,可以理解為兩條select語句可以同時對乙個資料庫操作,即使其中一條執行非常慢。寫鎖也稱為排它鎖,即不能同時執行,需等待其它寫鎖釋放才能執行。也可再select語句後面加上for update來手動上排它鎖,上共享鎖是lock in share mode;。

關於innodb:由於innodb的事務是自動提交的,所以先把自動事務提交關閉:set  autocommit=0;然後再對某一行進行select操作,同時另外乙個session對這一行資料進行寫操作,此操作會被阻塞,但如果此時對其它行資料進行寫操作,將會很快的執行成功,這就是行級鎖。其他操作與共享鎖和排它鎖的限制基本一致。

值得一提的是,innodb在沒有用到索引的時候是用的表級鎖。(如果不走索引的select新增讀鎖,那麼此時即使是更新不同行也需要等待讀鎖解鎖。

x:排它鎖    s:共享鎖

這部分內容有點多,就分開記錄了:

//@todo

可以通過 select@@tx_isolation檢視當前session事務隔離級別,

//@todo

如何建立乙個關係型資料庫

這是乙個容易讓人懵掉的題目,及其容易引發面試的 其實不必慌張,設計一款資料庫就跟設計一款軟體差不多,要將其劃分為多個模組,這道面試題就是為了考察模組劃分能力以及對資料庫的了解。首先要先知道關係型資料庫的組成 對資料庫進行劃分 一 儲存 檔案系統 資料庫的最主要功能,用來儲存資料,類似os檔案系統,將...

面試題 如何設計乙個關係型資料庫 和索引相關

1 首先要明白無名無實莫要用索引 因為資料中的記錄很多,為了方便我們查詢,提高查詢的效率 2 索引的原理 對要查詢的字段建立索引其實就是把該字段按照一定的方式排序 建立的索引只對該字段有用,如果查詢的字段改變,那麼這個索引也就無效了,比如圖書館的書是按照書名的第乙個字母排序的,那麼你想要找作者叫張三...

mysql索引與鎖的關係 關係型資料庫 索引與鎖

設計乙個關係型資料庫 png 索引模組 為什麼要使用索引 查詢時間複雜度從o n 提公升到o logn png 存在以下弊端,並且會多次io,影響速度。png 採用b tree b tree 多路搜尋樹,並不是二叉的 是一種常見的資料結構。使用b tree結構可以顯著減少定位記錄時所經歷的中間過程,...