關於資料庫

2022-03-09 21:48:29 字數 3550 閱讀 7422

innodb 邏輯儲存結構圖

從innodb 儲存引擎的邏輯儲存結構看,所有資料都被邏輯地存放在乙個空間中,稱之為表空間(tablespace)。表空間又由段(segment),區(extent),頁(page)組成。頁在一些文件中有時候也稱為塊(block)。 

表空間(tablespace)

段(segment)

區(extent)

頁(page)

原子性:事務是最小的執行單位,不允許分割。事務的原子性確保動作要麼全部完成,要麼完全不起作用;

一致性:執行事務前後,資料保持一致;

隔離性:併發訪問資料庫時,乙個使用者的事物不被其他事物所干擾,各併發事務之間資料庫是獨立的;

永續性:乙個事務被提交之後。它對資料庫中資料的改變是持久的,即使資料庫發生故障也不應該對其有任何影響。

在典型的應用程式中,多個事務併發執行,經常會操作相同的資料來完成各自的任務(多個使用者對統一資料進行操作)。併發雖然是必須的,但可能會導致以下的問題。

髒讀(dirty read):當乙個事務正在訪問資料並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時另外乙個事務也訪問了這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼另外乙個事務讀到的這個資料是「髒資料」,依據「髒資料」所做的操作可能是不正確的。

丟失修改(lost to modify):指在乙個事務讀取乙個資料時,另外乙個事務也訪問了該資料,那麼在第乙個事務中修改了這個資料後,第二個事務也修改了這個資料。這樣第乙個事務內的修改結果就被丟失,因此稱為丟失修改。 例如:事務1讀取某錶中的資料a=20,事務2也讀取a=20,事務1修改a=a-1,事務2也修改a=a-1,最終結果a=19,事務1的修改被丟失。

不可重複讀(unrepeatableread):指在乙個事務內多次讀同一資料。在這個事務還沒有結束時,另乙個事務也訪問該資料。那麼,在第乙個事務中的兩次讀資料之間,由於第二個事務的修改導致第乙個事務兩次讀取的資料可能不太一樣。這就發生了在乙個事務內兩次讀到的資料是不一樣的情況,因此稱為不可重複讀。

幻讀(phantom read):幻讀與不可重複讀類似。它發生在乙個事務(t1)讀取了幾行資料,接著另乙個併發事務(t2)插入了一些資料時。在隨後的查詢中,第乙個事務(t1)就會發現多了一些原本不存在的記錄,就好像發生了幻覺一樣,所以稱為幻讀。

通俗來說在一次事務裡面,多次查詢之後,結果集的個數不一致的情況叫做幻讀。而多出來或者少的哪一行被叫做 幻行。

不可重複度和幻讀區別:

不可重複讀的重點是修改,幻讀的重點在於新增或者刪除。

例1(同樣的條件

, 你讀取過的資料,

再次讀取出來發現值不一樣了 ):事務1中的a先生讀取自己的工資為 1000的操作還沒完成,事務2中的b先生就修改了a的工資為2000,導 致a再讀自己的工資時工資變為 2000;這就是不可重複讀。

例2(同樣的條件

, 第1

次和第2

次讀出來的記錄數不一樣 ):假某工資單表中工資大於3000的有4人,事務1讀取了所有工資大於3000的人,共查到4條記錄,這時事務2 又插入了一條工資大於3000的記錄,事務1再次讀取時查到的記錄就變為了5條,這樣就導致了幻讀

資料庫在寫入資料之前是先講對資料的改動寫入 redo log 和 undo log,然後在運算元據,如果成功提交事務就會講操作寫入磁碟;如果失敗就會根據redo log 和 undo log 逆向還原到事務操作之前的狀態。

很多人認為count(1)執行的效率會比count(*)高,原因是count(*)會存在全表掃瞄,而count(1)可以針對乙個字段進行查詢。其實不然,count(1)和count(*)都會對全表進行掃瞄,統計所有記錄的條數,包括那些為null的記錄,因此,它們的效率可以說是相差無幾。而count(字段)則與前兩者不同,它會統計該欄位不為null的記錄條數。

下面它們之間的一些對比:

1)在表沒有主鍵時,count(1)比count(*)快;

2)有主鍵時,主鍵作為計算條件,count(主鍵)效率最高;

3)若**只有乙個字段,則count(*)效率較高。

1. char型別的長度是固定的,varchar的長度是可變的。

這就表示,儲存字串'abc',使用char(10),表示儲存的字元將佔10個位元組(包括7個空字元)

使用varchar2(10),,則表示只佔3個位元組,10是最大值,當儲存的字元小於10時,按照實際的長度儲存。

2.char型別的效率比varchar的效率稍高

3.varchar 與 varchar2的區別

varchar2是oracle開發的乙個資料型別。

工業標準的varchar可以儲存空字串,oracle的varchar2還可以儲存null值,如果想要有向後相容的能力建議使用varchar2

4.varchar2比char節省空間,但是在效率上比char稍差些。既要獲得效率即必須犧牲一點空間,這就是設計上的"以空間換時間"

varchar2雖然比char節省空間,但是乙個varchar2列經常被修改,而且每次修改的資料長度不同,這會引起「行遷移的現象」,

而這造成的多餘的i/o,是資料庫設計中盡量避免的,在這種情況下使用char代替varchar2會更好些。

總結:1.如果乙個字段經常被修改,而且每次修改的資料長度不同,為了效率應當考慮用char定長代替varchar2變長。(列如乙個使用者的名字經常被修改)

2. 設計的時候盡量考慮  用空間換時間。

當 cpu 飆公升到 500%時,先用作業系統命令 top 命令觀察是不是 mysqld 占用導致的,如果不是,找出占用高的程序,並進行相關處理。如果是 mysqld 造成的,show processlist,看看裡面跑的 session 情況,是不是有消耗資源的 sql 在執行。找出消耗高的 sql, 看看執行計畫是否準確, index 是否缺失,或者實在是資料量太大造成。一般來說,肯定要 kill 掉這些執行緒(同時觀察 cpu 使用率是否下降),等進行相應的調整(比如說加索引、改 sql、改記憶體引數)之後,再重新跑這些 sql。也有可能是每個 sql 消耗資源並不多,但是突然之間, 有大量的 session 連進來導致 cpu 飆公升,這種情況就需要跟應用一起來分析為何連線數會激增,再做出相應的調整,比如說限制連線數等。

關於資料庫

在dao檔案下 第一步 public static void main string args 定義四個私有的全域性靜態變數 第二步 1.以增加一條新聞為例 增加一條新聞 param news return public boolean insertnews news news ps.close c...

關於資料庫

一 資料庫的基本操作 建立 creat database 資料庫名 避免重複資料庫 if not exists 資料庫名 檢視建庫語句 show creat database 資料庫名 查詢所有資料庫 show databases 使用 use 資料庫名 刪除資料庫 drop database 資料...

關於資料庫

1.mysql有哪兩個主要的儲存引擎 區別呢?2.儲存過程與儲存函式的區別?3.資料庫的優化 羅列一些 三.資料庫優化補充 4.快取優化 以mysql為例 資料庫自身查詢快取 my.ini query cache type query cache size 查詢快取命中 show status li...