MySQL 鎖機制 儲存引擎 資料型別

2021-10-06 15:23:32 字數 2876 閱讀 5423

mysql常用資料型別

mysql識別符號命名規則

mysql中utf8、utf8mb4字符集的區別

關於null

資料庫本身也提供了一些鎖,按加鎖方式分為

按照讀寫許可權分為

排它鎖、共享鎖都是資料庫提供的鎖機制,直接呼叫資料庫的相關語句即可。

共享鎖可能發生死鎖問題:一塊資料已經加了共享鎖,如果乙個事務先對這塊資料進行讀,再進行寫,寫操作需要等待共享鎖釋放才能執行,而這個事務的寫操作尚未執行,事務沒有提交,一直持有共享鎖,寫操作永遠等不到共享鎖釋放,即造成了死鎖。

其它執行緒等待獲取鎖,如果等待指定時間後還沒獲取到鎖,會丟擲超時等待異常。

按鎖粒度分為

eg. where id>=1 and id<=10,操作id在[1,10]上的記錄,會給[1,10]整個id區間加鎖,加鎖範圍的整個區間,不僅僅只是區間上存在的記錄。

假設之前刪除了id=5、id=8的記錄,這2行不存在的記錄即間隙,也會被鎖住,暫時不能被其它執行緒訪問。

mysql提供了多種儲存引擎,最常見的有2種:myisam 、innodb 。

myisam

myisam是5.5之前預設的儲存引擎,適合建立

innodb

innodb是mysql5.5及其之後的預設儲存引擎,適合建立

執行insert、update、delete語句之前,innodb會自動給涉及到的資料集加排它鎖,但只有在sql語句走索引時加的排它鎖才是行鎖,表沒有建立索引或者sql語句沒有走索引時加的排它鎖是表鎖。

innodb的行鎖是給索引中的行加鎖,表鎖是給資料表中的行加鎖。行鎖的效能遠高於表鎖,盡量讓sql語句走索引,一來可以快速定位記錄位置,二來借助行鎖可以實現更高的併發。

數值型資料型別

描述tinyint

-128 ~ 127

smallint

正負3w+

mediumint

正負800w+

int 或者 integer

正負21億+

bigint

正負900千萬億+

float

單精度,4位元組,10的-38次方

double

雙精度,8位元組,10的-308次方

decimal

定點型整型可以指定最大位數,eg. int(11),不指定預設為可儲存的最大位數。

浮點型、decimal可以指定總位數、小數字數,eg. double(10,2),最長10位,小數2位(超出會四捨五入),decimal不指定預設為(10,0)。

float、double有誤差,如果對精度要求很高,比如涉及到錢財,用decimal。

字串資料型別

最大字元數

char

255varchar

6w+tinytext

255text

6w+mediumtext

1千萬+

longtext

42億+

char、varchar可指定字元數、可設定預設值,eg. varchar(5) 最多只能儲存5個字元,其它字串型別不能指定長度、預設值。

char是定長字串,內容長度不夠時自動補空格,適合儲存固定長度的字串,varchar是變長字串。

日期時間

資料型別

範圍date

yyyy-mm-dd,1000-01-01 ~ 9999-12-31

datetime

yyyy-mm-dd hh:mm:ss ,1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

timestamp

yyyy-mm-dd hh:mm:ss,1970-01-01 00:00:00 ~ 2038-01-19…

運算元據庫時,使用的就是上面的格式,eg. timestamp

insert

into tb_user (create_time)

values

('2019-02-02 09:02:20'

);

增刪改是這個格式,查詢返回的也是這個格式。可以直接new date()獲取當期的日期時間,date使用util包下的date即可。

datetime、timestamp的區別是能表示的範圍不同,datetime 8位元組,timestamp 4位元組,datetime能表示的範圍更大。

時間日期型別獨有的選項:根據當前時間戳更新。勾選後,如果插入時未設定該字段的值,會自動使用當前時間;每次更新該條記錄時,不管有沒有手動set該字段的值,該字段都會更新為當前時間。如果要記錄的是最近一次操作的時間,可以勾選;其他情況下,都應該手動set設定值。

二進位制資料

mysql可以儲存二進位制資料,但操作二進位制資料的效能並不好,盡量少用二進位制資料型別。

關於 enum 列舉

mysql支援enum這種資料型別,插入列舉型別時,mysql會先檢查值是否在允許值列表中,如果不在則檢查是否在列舉的索引列表中,在列舉索引列表中的值也可以插入。

比如enum的允許值是字串"0"、「1」、「2」,對應的索引列表是1、2、3(從1開始)

不熟悉mysql列舉特性的人使用容易出錯,盡量避免使用列舉。

mysql識別符號識別符號包括表名、欄位名、資料庫程式設計中的變數名

建表時尤其要注意:欄位名不要使用資料庫關鍵字,比如 type,可以換成 ***_type

utf8的表示乙個字元最大可用三個位元組,基本可以表示所有字元,但表示不了極其生僻的字元、新增的字元,比如emoji 表情。

utf8mb4是utf8的超集,mb4即most bytes 4的意思,用於相容四位元組的unicode。

一般使用utf8就夠了,當然使用utf8mb4相容性更好。

在mysql中,如果不指定欄位not null,字段預設可以為null。

(資料庫十一)MySQL 儲存引擎及其鎖機制

常用的儲存引擎如下 1 innodb 引擎 innodb 引擎提供了對資料庫 acid 事務的支援,並且還提供了行級鎖和外來鍵的約束,它的設計目標就是處理大資料容量的資料庫系統。mysql 5.7.15版本預設使用的是 innodb 版本 2 myiasm引擎 原本mysql的預設引擎 不提供事務的...

Innodb儲存引擎的鎖機制(一)

隔離級別到底如何實現的呢?鎖 mvcc 鎖是用於管理不同事務對共享資源的併發訪問 表鎖與行鎖的區別 鎖定粒度 表鎖 行鎖 加鎖效率 表鎖 行鎖 衝突概率 表鎖 行鎖 併發效能 表鎖 行鎖 innodb儲存引擎支援行鎖和表鎖 另類的行鎖 行鎖的演算法 users表的id和idcode和name列是索引...

MySql儲存引擎InnoDB的鎖

innodb實現了以下兩種型別的行鎖 共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,阻止其他事務獲得相同資料集的共享鎖和排他鎖。共享鎖就是我讀的時候,你可以讀,但是不能寫。排他鎖就是我寫的時候,你不能讀也不能寫。另外,為了允許行鎖和...