總目錄: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;


例子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