一、mysql 非少數(shù)索引的等值查詢?yōu)槭裁匆觛ap鎖
mysql 中非少數(shù)索引使用的也是 B+ 樹來組織數(shù)據(jù)結(jié)構(gòu)。
假設(shè) id 的索引結(jié)構(gòu)在葉子節(jié)點(diǎn)從左到右的排列順序是 1 1 2 2 4 5,如果我們只使用 記錄鎖來鎖住索引 2,因?yàn)樗饕杏袃蓚€(gè) 2,所以這兩個(gè) 2 都會(huì)被加上一個(gè)記錄鎖。
現(xiàn)在假設(shè)有另外一個(gè)事務(wù),它執(zhí)行
insert into table? values(2);
也就是說,另外一個(gè)事務(wù)需要添加一條記錄,并且 id=2,因?yàn)樯厦嫖覀冡槍?duì) 兩個(gè) 2 加的是兩個(gè)記錄鎖,所以這個(gè)事務(wù)可以去執(zhí)行。
為了避免幻讀,此時(shí)要使用記錄鎖鎖住兩個(gè) 2 的主鍵索引,另外兩個(gè) 2 的非少數(shù)索引也必須鎖住,然后再鎖住三個(gè)區(qū)間。
我們使用案例驗(yàn)證下這些鎖:
create table test.testtable
(
??? id??? bigint auto_increment primary key,
??? age int(20)???? null
);
create index age_index on test.testtable (age);
insert into testtable? values(1,1);
insert into testtable? values(3,1);
insert into testtable? values(5,2);
insert into testtable? values(7,2);
insert into testtable? values(9,4);
insert into testtable? values(13,5);
begin;
select * from testtable where age = 2 for update;
名列前茅個(gè)是 意向排他鎖,這個(gè)不分析了。
第二個(gè)和第三個(gè)是 next-key 鎖,鎖住的是(1,2] 和 (2,2]。
第四個(gè)和第五個(gè)是記錄鎖,鎖住兩個(gè) 2 的主鍵索引。
第六個(gè)是間隙鎖,鎖住(2,4)區(qū)間。
延伸閱讀:
二、字符集(Character set)是什么
是多個(gè)字符(英文字符,漢字字符,或者其他國(guó)家語言字符)的集合,字符集種類較多,每個(gè)字符集包含的字符個(gè)數(shù)不同。
特點(diǎn):
①字符編碼方式是用一個(gè)或多個(gè)字節(jié)表示字符集中的一個(gè)字符
②每種字符集都有自己特有的編碼方式,因此同一個(gè)字符,在不同字符集的編碼方式下,會(huì)產(chǎn)生不同的二進(jìn)制
常見字符集:
ASCII字符集:基于羅馬字母表的一套字符集,它采用1個(gè)字節(jié)的低7位表示字符,高位始終為0。
LATIN1字符集:相對(duì)于ASCII字符集做了擴(kuò)展,仍然使用一個(gè)字節(jié)表示字符,但啟用了高位,擴(kuò)展了字符集的表示范圍。
GBK字符集:支持中文,字符有一字節(jié)編碼和兩字節(jié)編碼方式。
UTF8字符集:Unicode字符集的一種,是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),支持了所有國(guó)家的文字字符,utf8采用1-4個(gè)字節(jié)表示字符。