5.1.3MySQL事務(wù)與索引

總目錄:http://www.itdecent.cn/p/e406a9bc93a9

數(shù)據(jù)庫 - 子目錄:http://www.itdecent.cn/p/4499e57a5604

Yuan先生的數(shù)據(jù)庫進(jìn)階:https://www.cnblogs.com/yuanchenqi/articles/6437362.html

事務(wù)

什么是事務(wù)

事務(wù)指邏輯上的一組操作,組成這組操作的各個(gè)單元,要不全部成功,要不全部不成功。


事務(wù)特性

<1> 原子性(Atomicity):原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

<2> 一致性(Consistency):事務(wù)前后數(shù)據(jù)的完整性必須保持一致。在事務(wù)執(zhí)行之前數(shù)據(jù)庫是符合數(shù)據(jù)完整性約束的,無論事務(wù)是否執(zhí)行成功,事務(wù)結(jié)束后的數(shù)據(jù)庫中的數(shù)據(jù)也應(yīng)該是符合完整性約束的。在某一時(shí)間點(diǎn),如果數(shù)據(jù)庫中的所有記錄都能保證滿足當(dāng)前數(shù)據(jù)庫中的所有約束,則可以說當(dāng)前的數(shù)據(jù)庫是符合數(shù)據(jù)完整性約束的。

比如刪部門表前應(yīng)該刪掉關(guān)聯(lián)員工(已經(jīng)建立外鍵),如果數(shù)據(jù)庫服務(wù)器發(fā)生錯(cuò)誤,有一個(gè)員工沒刪掉,那么此時(shí)員工的部門表已經(jīng)刪除,那么就不符合完整性約束了,所以這樣的數(shù)據(jù)庫也就性能太差啦!

<3>隔離性(Isolation):事務(wù)的隔離性是指多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),一個(gè)用戶的事務(wù)不能被其它用戶的事務(wù)所干擾,多個(gè)并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離。

將數(shù)據(jù)庫設(shè)計(jì)為串行化程的數(shù)據(jù)庫,讓一張表在同一時(shí)間內(nèi)只能有一個(gè)線程來操作。如果將數(shù)據(jù)庫設(shè)計(jì)為這樣,那數(shù)據(jù)庫的效率太低了。所以數(shù)據(jù)庫的設(shè)計(jì)這沒有直接將數(shù)據(jù)庫設(shè)計(jì)為串行化,而是為數(shù)據(jù)庫提供多個(gè)隔離級別選項(xiàng),使數(shù)據(jù)庫的使用者可以根據(jù)使用情況自己定義到底需要什么樣的隔離級別。

不考慮隔離性可能出現(xiàn)的問題:

臟讀

一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)未提交的數(shù)據(jù),這是特別危險(xiǎn)的,要盡力防止。

不可重復(fù)讀

在一個(gè)事務(wù)內(nèi)讀取表中的某一行數(shù)據(jù),多次讀取結(jié)果不同。(一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)--增加記錄、刪除記錄、修改記錄),在某寫情況下并不是問題,在另一些情況下就是問題。

虛讀

是指在一個(gè)事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致。(一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)---增加記錄、刪除記錄),在某些情況下并不是問題,在另一些情況下就是問題。

四個(gè)隔離級別:

Serializable:可避免臟讀、不可重復(fù)讀、虛讀情況的發(fā)生。(串行化)

Repeatable read:可避免臟讀、不可重復(fù)讀情況的發(fā)生。(可重復(fù)讀)不可以避免虛讀

Read committed:可避免臟讀情況發(fā)生(讀已提交)

Read uncommitted:最低級別,以上情況均無法保證。(讀未提交)

安全性考慮:Serializable>Repeatable read>Read committed>Read uncommitted

數(shù)據(jù)庫效率:Read uncommitted>Read committed>Repeatable read>Serializable

一般情況下,我們會使用Repeatable read、Read committed mysql數(shù)據(jù)庫默認(rèn)的數(shù)據(jù)庫隔離級別Repeatable read

mysql中設(shè)置數(shù)據(jù)庫的隔離級別語句:

set [global/session]?transaction?isolation?level?xxxx;

如果使用global則修改的是數(shù)據(jù)庫的默認(rèn)隔離級別,所有新開的窗口的隔離級別繼承自這個(gè)默認(rèn)隔離級別?

如果使用session修改,則修改的是當(dāng)前客戶端的隔離級別,和數(shù)據(jù)庫默認(rèn)隔離級別無關(guān)。

<4>持久性(Durability):持久性是指一個(gè)事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。


事務(wù)命令

#開啟事務(wù)

start transaction;

#回滾

rollback

#提交事務(wù)

commit;

#設(shè)置回滾點(diǎn)

savepoint rol_name;

#回滾至rol_name回滾點(diǎn)

rollbackto rol_name;

建表
插入數(shù)據(jù)


例子1:


例子2



索引

創(chuàng)建/添加/刪除索引

在創(chuàng)建表時(shí)添加索引

CREATE TABLE 表名( 屬性名 數(shù)據(jù)類型[完整性約束條件],

屬性名 數(shù)據(jù)類型[完整性約束條件],

......

屬性名 數(shù)據(jù)類型

[ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY

[ 別名] ( 屬性名1 [(長度)] [ ASC | DESC] )

);


創(chuàng)建索引

CREATE <索引名> ON <表名> (<列名> [<長度>] [ ASC | DESC])

or

ALTER TABLE 表名 ADD

?[UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (字段名[(長度)] [ASC |DESC]) ;?


刪除索引

DROP INDEX 索引名 on 表名

創(chuàng)建普通索引示例:

創(chuàng)建唯一索引示例:

創(chuàng)建全文索引示例:

創(chuàng)建多列索引示例:

添加索引


刪除索引



索引性能測試


--創(chuàng)建表

create table Indexdb.t1(id int,name varchar(20));


--存儲過程

delimiter $$

create procedure autoinsert()

BEGIN

declare i int default 1;

while(i<500000)do

insert into Indexdb.t1 values(i,'yuan');

set i=i+1;

end while;

END$$


delimiter ;


--調(diào)用函數(shù)

call autoinsert();


-- 花費(fèi)時(shí)間比較:


-- 創(chuàng)建索引前

? select * from Indexdb.t1 where id=300000;--0.32s


-- 添加索引

? create index index_id on Indexdb.t1(id);


-- 創(chuàng)建索引后

? select * from Indexdb.t1 where id=300000;--0.00s

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容