精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

看這些MySQL的重要知識(shí)點(diǎn),吃透它

數(shù)據(jù)庫 MySQL
MySQL 是一種關(guān)系型數(shù)據(jù)庫,在Java企業(yè)級(jí)開發(fā)中非常常用,因?yàn)?MySQL 是開源免費(fèi)的,并且方便擴(kuò)展。

 [[280068]]

序、什么是MySQL?

MySQL 是一種關(guān)系型數(shù)據(jù)庫,在Java企業(yè)級(jí)開發(fā)中非常常用,因?yàn)?MySQL 是開源免費(fèi)的,并且方便擴(kuò)展。阿里巴巴數(shù)據(jù)庫系統(tǒng)也大量用到了 MySQL,因此它的穩(wěn)定性是有保障的。MySQL是開放源代碼的,因此任何人都可以在 GPL(General Public License) 的許可下下載并根據(jù)個(gè)性化的需要對(duì)其進(jìn)行修改。MySQL的默認(rèn)端口號(hào)是3306。

一、事務(wù)相關(guān)

什么是事務(wù)?

事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行。

事務(wù)最經(jīng)典也經(jīng)常被拿出來說例子就是轉(zhuǎn)賬了。假如小明要給小紅轉(zhuǎn)賬1000元,這個(gè)轉(zhuǎn)賬會(huì)涉及到兩個(gè)關(guān)鍵操作就是:將小明的余額減少1000元,將小紅的余額增加1000元。萬一在這兩個(gè)操作之間突然出現(xiàn)錯(cuò)誤比如銀行系統(tǒng)崩潰,導(dǎo)致小明余額減少而小紅的余額沒有增加,這樣就不對(duì)了。事務(wù)就是保證這兩個(gè)關(guān)鍵操作要么都成功,要么都要失敗。

事物的四大特性(ACID)介紹一下?

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

  • 原子性: 事務(wù)是最小的執(zhí)行單位,不允許分割。事務(wù)的原子性確保動(dòng)作要么全部完成,要么完全不起作用;
  • 一致性: 執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致,多個(gè)事務(wù)對(duì)同一個(gè)數(shù)據(jù)讀取的結(jié)果是相同的;
  • 隔離性: 并發(fā)訪問數(shù)據(jù)庫時(shí),一個(gè)用戶的事務(wù)不被其他事務(wù)所干擾,各并發(fā)事務(wù)之間數(shù)據(jù)庫是獨(dú)立的;
  • 持久性: 一個(gè)事務(wù)被提交之后。它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的,即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對(duì)其有任何影響。

并發(fā)事務(wù)帶來哪些問題?

在典型的應(yīng)用程序中,多個(gè)事務(wù)并發(fā)運(yùn)行,經(jīng)常會(huì)操作相同的數(shù)據(jù)來完成各自的任務(wù)(多個(gè)用戶對(duì)統(tǒng)一數(shù)據(jù)進(jìn)行操作)。并發(fā)雖然是必須的,但可能會(huì)導(dǎo)致以下的問題:

  • 臟讀(Dirty read): 當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù)并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時(shí)另外一個(gè)事務(wù)也訪問了這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是“臟數(shù)據(jù)”,依據(jù)“臟數(shù)據(jù)”所做的操作可能是不正確的。
  • 丟失修改(Lost to modify): 指在一個(gè)事務(wù)讀取一個(gè)數(shù)據(jù)時(shí),另外一個(gè)事務(wù)也訪問了該數(shù)據(jù),那么在第一個(gè)事務(wù)中修改了這個(gè)數(shù)據(jù)后,第二個(gè)事務(wù)也修改了這個(gè)數(shù)據(jù)。這樣第一個(gè)事務(wù)內(nèi)的修改結(jié)果就被丟失,因此稱為丟失修改。例如:事務(wù)1讀取某表中的數(shù)據(jù)A=20,事務(wù)2也讀取A=20,事務(wù)1修改A=A-1,事務(wù)2也修改A=A-1,最終結(jié)果A=19,事務(wù)1的修改被丟失。
  • 不可重復(fù)讀(Unrepeatableread): 指在一個(gè)事務(wù)內(nèi)多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另一個(gè)事務(wù)也訪問該數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改導(dǎo)致第一個(gè)事務(wù)兩次讀取的數(shù)據(jù)可能不太一樣。這就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的情況,因此稱為不可重復(fù)讀。
  • 幻讀(Phantom read): 幻讀與不可重復(fù)讀類似。它發(fā)生在一個(gè)事務(wù)(T1)讀取了幾行數(shù)據(jù),接著另一個(gè)并發(fā)事務(wù)(T2)插入了一些數(shù)據(jù)時(shí)。在隨后的查詢中,第一個(gè)事務(wù)(T1)就會(huì)發(fā)現(xiàn)多了一些原本不存在的記錄,就好像發(fā)生了幻覺一樣,所以稱為幻讀。

不可重復(fù)度和幻讀區(qū)別:

不可重復(fù)讀的重點(diǎn)是修改,幻讀的重點(diǎn)在于新增或者刪除。

例1(同樣的條件, 你讀取過的數(shù)據(jù), 再次讀取出來發(fā)現(xiàn)值不一樣了 ):事務(wù)1中的A先生讀取自己的工資為 1000的操作還沒完成,事務(wù)2中的B先生就修改了A的工資為2000,導(dǎo) 致A再讀自己的工資時(shí)工資變?yōu)?2000;這就是不可重復(fù)讀。

例2(同樣的條件, 第1次和第2次讀出來的記錄數(shù)不一樣 ):假某工資單表中工資大于3000的有4人,事務(wù)1讀取了所有工資大于3000的人,共查到4條記錄,這時(shí)事務(wù)2 又插入了一條工資大于3000的記錄,事務(wù)1再次讀取時(shí)查到的記錄就變?yōu)榱?條,這樣就導(dǎo)致了幻讀。

事務(wù)隔離級(jí)別有哪些?MySQL的默認(rèn)隔離級(jí)別是?

SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別:

  • READ-UNCOMMITTED(讀取未提交): 最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更,可能會(huì)導(dǎo)致臟讀、幻讀或不可重復(fù)讀。
  • READ-COMMITTED(讀取已提交): 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復(fù)讀仍有可能發(fā)生。
  • REPEATABLE-READ(可重復(fù)讀): 對(duì)同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生。
  • SERIALIZABLE(可串行化): 最高的隔離級(jí)別,完全服從ACID的隔離級(jí)別。所有的事務(wù)依次逐個(gè)執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級(jí)別可以防止臟讀、不可重復(fù)讀以及幻讀。

隔離級(jí)別

臟讀

不可重復(fù)讀

幻影讀

READ-UNCOMMITTED

READ-COMMITTED

×

REPEATABLE-READ

×

×

SERIALIZABLE

×

×

×

MySQL InnoDB 存儲(chǔ)引擎的默認(rèn)支持的隔離級(jí)別是 REPEATABLE-READ(可重讀)。我們可以通過SELECT @@tx_isolation;命令來查看

  1. mysql> SELECT @@tx_isolation; 
  2. +-----------------+ 
  3. | @@tx_isolation | 
  4. +-----------------+ 
  5. REPEATABLE-READ | 
  6. +-----------------+ 

這里需要注意的是:與 SQL 標(biāo)準(zhǔn)不同的地方在于InnoDB 存儲(chǔ)引擎在 REPEATABLE-READ(可重讀)事務(wù)隔離級(jí)別下使用的是Next-Key Lock 鎖算法,因此可以避免幻讀的產(chǎn)生,這與其他數(shù)據(jù)庫系統(tǒng)(如 SQL Server)是不同的。所以說InnoDB 存儲(chǔ)引擎的默認(rèn)支持的隔離級(jí)別是 REPEATABLE-READ(可重讀)已經(jīng)可以完全保證事務(wù)的隔離性要求,即達(dá)到了 SQL標(biāo)準(zhǔn)的SERIALIZABLE(可串行化)隔離級(jí)別。

因?yàn)楦綦x級(jí)別越低,事務(wù)請(qǐng)求的鎖越少,所以大部分?jǐn)?shù)據(jù)庫系統(tǒng)的隔離級(jí)別都是READ-COMMITTED(讀取提交內(nèi)容):,但是你要知道的是InnoDB 存儲(chǔ)引擎默認(rèn)使用 REPEATABLE-READ(可重讀)并不會(huì)有任何性能損失。

InnoDB 存儲(chǔ)引擎在 分布式事務(wù) 的情況下一般會(huì)用到SERIALIZABLE(可串行化)隔離級(jí)別。

二、索引相關(guān)

為什么索引能提高查詢速度

以下內(nèi)容整理自:《數(shù)據(jù)庫兩大神器【索引和鎖】》作者 :Java3y

先從 MySQL 的基本存儲(chǔ)結(jié)構(gòu)說起

MySQL的基本存儲(chǔ)結(jié)構(gòu)是頁 (記錄都存在頁里邊) :

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

  • 各個(gè)數(shù)據(jù)頁可以組成一個(gè)雙向鏈表
  • 每個(gè)數(shù)據(jù)頁中的記錄又可以組成一個(gè)單向鏈表

- 每個(gè)數(shù)據(jù)頁都會(huì)為存儲(chǔ)在它里邊兒的記錄生成一個(gè)頁目錄,在通過主鍵查找某條記錄的時(shí)候可以在頁目錄中使用二分法快速定位到對(duì)應(yīng)的槽,然后再遍歷該槽對(duì)應(yīng)分組中的記錄即可快速找到指定的記錄- 以其他列(非主鍵)作為搜索條件:只能從最小記錄開始依次遍歷單鏈表中的每條記錄。

所以說,如果我們寫select * from user where indexname = 'xxx'這樣沒有進(jìn)行任何優(yōu)化的sql語句,默認(rèn)會(huì)這樣做:

  1. 定位到記錄所在的頁:需要遍歷雙向鏈表,找到所在的頁
  2. 從所在的頁內(nèi)中查找相應(yīng)的記錄:由于不是根據(jù)主鍵查詢,只能遍歷所在頁的單鏈表了

很明顯,在數(shù)據(jù)量很大的情況下這樣查找會(huì)很慢!這樣的時(shí)間復(fù)雜度為O(n)。

索引做了些什么可以讓我們查詢加快速度呢?其實(shí)就是將無序的數(shù)據(jù)變成有序(相對(duì)):

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

要找到id為8的記錄簡(jiǎn)要步驟:

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

很明顯的是:沒有用索引我們是需要遍歷雙向鏈表來定位對(duì)應(yīng)的頁,現(xiàn)在通過 “目錄” 就可以很快地定位到對(duì)應(yīng)的頁上了!(二分查找,時(shí)間復(fù)雜度近似為O(logn))

其實(shí)底層結(jié)構(gòu)就是B+樹,B+樹作為樹的一種實(shí)現(xiàn),能夠讓我們很快地查找出對(duì)應(yīng)的記錄。

需要Java資料,轉(zhuǎn)發(fā)文章+關(guān)注私信【Java】獲取

什么是最左前綴原則?

MySQL中的索引可以以一定順序引用多列,這種索引叫作聯(lián)合索引。如User表的name和city加聯(lián)合索引就是(name,city),而最左前綴原則指的是,如果查詢的時(shí)候查詢條件精確匹配索引的左邊連續(xù)一列或幾列,則此列就可以被用到。如下:

  1. select * from user where name=xx and city=xx ; //可以命中索引 
  2. select * from user where name=xx ; // 可以命中索引 
  3. select * from user where city=xx ; // 無法命中索引 

這里需要注意的是,查詢的時(shí)候如果兩個(gè)條件都用上了,但是順序不同,如 city= xx and name =xx,那么現(xiàn)在的查詢引擎會(huì)自動(dòng)優(yōu)化為匹配聯(lián)合索引的順序,這樣是能夠命中索引的。

由于最左前綴原則,在創(chuàng)建聯(lián)合索引時(shí),索引字段的順序需要考慮字段值去重之后的個(gè)數(shù),較多的放前面。ORDER BY子句也遵循此規(guī)則。

注意避免冗余索引

冗余索引指的是索引的功能相同,能夠命中就肯定能命中 ,那么 就是冗余索引如(name,city )和(name )這兩個(gè)索引就是冗余索引,能夠命中后者的查詢肯定是能夠命中前者的 在大多數(shù)情況下,都應(yīng)該盡量擴(kuò)展已有的索引而不是創(chuàng)建新索引。

MySQLS.7 版本后,可以通過查詢 sys 庫的 schema_redundant_indexes 表來查看冗余索引

Mysql如何為表字段添加索引?

1.添加PRIMARY KEY(主鍵索引)

  1. ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

2.添加UNIQUE(唯一索引)

  1. ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 

3.添加INDEX(普通索引)

  1. ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 

4.添加FULLTEXT(全文索引)

  1. ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

5.添加多列索引

  1. ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` ) 

三、存儲(chǔ)引擎

一些常用命令

查看MySQL提供的所有存儲(chǔ)引擎

  1. mysql> show engines; 

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

從上圖我們可以查看出 MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎是InnoDB,并且在5.7版本所有的存儲(chǔ)引擎中只有 InnoDB 是事務(wù)性存儲(chǔ)引擎,也就是說只有 InnoDB 支持事務(wù)。

查看MySQL當(dāng)前默認(rèn)的存儲(chǔ)引擎

我們也可以通過下面的命令查看默認(rèn)的存儲(chǔ)引擎。

  1. mysql> show variables like '%storage_engine%'

查看表的存儲(chǔ)引擎

  1. show table status like "table_name" ; 

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

MyISAM和InnoDB區(qū)別

MyISAM是MySQL的默認(rèn)數(shù)據(jù)庫引擎(5.5版之前)。雖然性能極佳,而且提供了大量的特性,包括全文索引、壓縮、空間函數(shù)等,但MyISAM不支持事務(wù)和行級(jí)鎖,而且最大的缺陷就是崩潰后無法安全恢復(fù)。不過,5.5版本之后,MySQL引入了InnoDB(事務(wù)性數(shù)據(jù)庫引擎),MySQL 5.5版本后默認(rèn)的存儲(chǔ)引擎為InnoDB。

大多數(shù)時(shí)候我們使用的都是 InnoDB 存儲(chǔ)引擎,但是在某些情況下使用 MyISAM 也是合適的比如讀密集的情況下。(如果你不介意 MyISAM 崩潰回復(fù)問題的話)。

兩者的對(duì)比:

  1. 是否支持行級(jí)鎖 : MyISAM 只有表級(jí)鎖(table-level locking),而InnoDB 支持行級(jí)鎖(row-level locking)和表級(jí)鎖,默認(rèn)為行級(jí)鎖。
  2. 是否支持事務(wù)和崩潰后的安全恢復(fù):MyISAM 強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行比InnoDB類型更快,但是不提供事務(wù)支持。但是InnoDB提供事務(wù)支持事務(wù),外部鍵等高級(jí)數(shù)據(jù)庫功能。具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表。
  3. 是否支持外鍵: MyISAM不支持,而InnoDB支持。
  4. 是否支持MVCC :僅 InnoDB 支持。應(yīng)對(duì)高并發(fā)事務(wù), MVCC比單純的加鎖更高效;MVCC只在 READ COMMITTED 和 REPEATABLE READ 兩個(gè)隔離級(jí)別下工作;MVCC可以使用 樂觀(optimistic)鎖 和 悲觀(pessimistic)鎖來實(shí)現(xiàn);各數(shù)據(jù)庫中MVCC實(shí)現(xiàn)并不統(tǒng)一。
  5. ......

《MySQL高性能》上面有一句話這樣寫到:

不要輕易相信“MyISAM比InnoDB快”之類的經(jīng)驗(yàn)之談,這個(gè)結(jié)論往往不是絕對(duì)的。在很多我們已知場(chǎng)景中,InnoDB的速度都可以讓MyISAM望塵莫及,尤其是用到了聚簇索引,或者需要訪問的數(shù)據(jù)都可以放入內(nèi)存的應(yīng)用。

一般情況下我們選擇 InnoDB 都是沒有問題的,但是某事情況下你并不在乎可擴(kuò)展能力和并發(fā)能力,也不需要事務(wù)支持,也不在乎崩潰后的安全恢復(fù)問題的話,選擇MyISAM也是一個(gè)不錯(cuò)的選擇。但是一般情況下,我們都是需要考慮到這些問題的。

四、樂觀鎖與悲觀鎖的區(qū)別

1、悲觀鎖

總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)阻塞直到它拿到鎖(共享資源每次只給一個(gè)線程使用,其它線程阻塞,用完后再把資源轉(zhuǎn)讓給其它線程)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨(dú)占鎖就是悲觀鎖思想的實(shí)現(xiàn)。

2、樂觀鎖

總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)機(jī)制和CAS算法實(shí)現(xiàn)。樂觀鎖適用于多讀的應(yīng)用類型,這樣可以提高吞吐量,像數(shù)據(jù)庫提供的類似于write_condition機(jī)制,其實(shí)都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實(shí)現(xiàn)方式CAS實(shí)現(xiàn)的。

3、兩種鎖的使用場(chǎng)景

從上面對(duì)兩種鎖的介紹,我們知道兩種鎖各有優(yōu)缺點(diǎn),不可認(rèn)為一種好于另一種,像樂觀鎖適用于寫比較少的情況下(多讀場(chǎng)景),即沖突真的很少發(fā)生的時(shí)候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個(gè)吞吐量。但如果是多寫的情況,一般會(huì)經(jīng)常產(chǎn)生沖突,這就會(huì)導(dǎo)致上層應(yīng)用會(huì)不斷的進(jìn)行retry,這樣反倒是降低了性能,所以一般多寫的場(chǎng)景下用悲觀鎖就比較合適。

4、樂觀鎖常見的兩種實(shí)現(xiàn)方式

樂觀鎖一般會(huì)使用版本號(hào)機(jī)制或CAS算法實(shí)現(xiàn)。

4.1. 版本號(hào)機(jī)制

一般是在數(shù)據(jù)表中加上一個(gè)數(shù)據(jù)版本號(hào)version字段,表示數(shù)據(jù)被修改的次數(shù),當(dāng)數(shù)據(jù)被修改時(shí),version值會(huì)加一。當(dāng)線程A要更新數(shù)據(jù)值時(shí),在讀取數(shù)據(jù)的同時(shí)也會(huì)讀取version值,在提交更新時(shí),若剛才讀取到的version值為當(dāng)前數(shù)據(jù)庫中的version值相等時(shí)才更新,否則重試更新操作,直到更新成功。

舉一個(gè)簡(jiǎn)單的例子: 假設(shè)數(shù)據(jù)庫中帳戶信息表中有一個(gè) version 字段,當(dāng)前值為 1 ;而當(dāng)前帳戶余額字段( balance )為 $100 。

  1. 操作員 A 此時(shí)將其讀出( version=1 ),并從其帳戶余額中扣除 $50( $100-$50 )。
  2. 在操作員 A 操作的過程中,操作員B 也讀入此用戶信息( version=1 ),并從其帳戶余額中扣除 $20 ( $100-$20 )。
  3. 操作員 A 完成了修改工作,將數(shù)據(jù)版本號(hào)加一( version=2 ),連同帳戶扣除后余額( balance=$50 ),提交至數(shù)據(jù)庫更新,此時(shí)由于提交數(shù)據(jù)版本大于數(shù)據(jù)庫記錄當(dāng)前版本,數(shù)據(jù)被更新,數(shù)據(jù)庫記錄 version 更新為 2 。
  4. 操作員 B 完成了操作,也將版本號(hào)加一( version=2 )試圖向數(shù)據(jù)庫提交數(shù)據(jù)( balance=$80 ),但此時(shí)比對(duì)數(shù)據(jù)庫記錄版本時(shí)發(fā)現(xiàn),操作員 B 提交的數(shù)據(jù)版本號(hào)為 2 ,數(shù)據(jù)庫記錄當(dāng)前版本也為 2 ,不滿足 “ 提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新 “ 的樂觀鎖策略,因此,操作員 B 的提交被駁回。

這樣,就避免了操作員 B 用基于 version=1 的舊數(shù)據(jù)修改的結(jié)果覆蓋操作員A 的操作結(jié)果的可能。

4.2. CAS算法

即compare and swap(比較與交換),是一種有名的無鎖算法。無鎖編程,即不使用鎖的情況下實(shí)現(xiàn)多線程之間的變量同步,也就是在沒有線程被阻塞的情況下實(shí)現(xiàn)變量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三個(gè)操作數(shù)

  • 需要讀寫的內(nèi)存值 V
  • 進(jìn)行比較的值 A
  • 擬寫入的新值 B

當(dāng)且僅當(dāng) V 的值等于 A時(shí),CAS通過原子方式用新值B來更新V的值,否則不會(huì)執(zhí)行任何操作(比較和替換是一個(gè)原子操作)。一般情況下是一個(gè)自旋操作,即不斷的重試。

5、樂觀鎖的缺點(diǎn)

ABA 問題是樂觀鎖一個(gè)常見的問題

5.1 ABA 問題

如果一個(gè)變量V初次讀取的時(shí)候是A值,并且在準(zhǔn)備賦值的時(shí)候檢查到它仍然是A值,那我們就能說明它的值沒有被其他線程修改過了嗎?很明顯是不能的,因?yàn)樵谶@段時(shí)間它的值可能被改為其他值,然后又改回A,那CAS操作就會(huì)誤認(rèn)為它從來沒有被修改過。這個(gè)問題被稱為CAS操作的 "ABA"問題。

JDK 1.5 以后的 AtomicStampedReference 類就提供了此種能力,其中的 compareAndSet 方法就是首先檢查當(dāng)前引用是否等于預(yù)期引用,并且當(dāng)前標(biāo)志是否等于預(yù)期標(biāo)志,如果全部相等,則以原子方式將該引用和該標(biāo)志的值設(shè)置為給定的更新值。

5.2 循環(huán)時(shí)間長(zhǎng)開銷大

自旋CAS(也就是不成功就一直循環(huán)執(zhí)行直到成功)如果長(zhǎng)時(shí)間不成功,會(huì)給CPU帶來非常大的執(zhí)行開銷。 如果JVM能支持處理器提供的pause指令那么效率會(huì)有一定的提升,pause指令有兩個(gè)作用,第一它可以延遲流水線執(zhí)行指令(de-pipeline),使CPU不會(huì)消耗過多的執(zhí)行資源,延遲的時(shí)間取決于具體實(shí)現(xiàn)的版本,在一些處理器上延遲時(shí)間是零。第二它可以避免在退出循環(huán)的時(shí)候因內(nèi)存順序沖突(memory order violation)而引起CPU流水線被清空(CPU pipeline flush),從而提高CPU的執(zhí)行效率。

5.3 只能保證一個(gè)共享變量的原子操作

CAS 只對(duì)單個(gè)共享變量有效,當(dāng)操作涉及跨多個(gè)共享變量時(shí) CAS 無效。但是從 JDK 1.5開始,提供了AtomicReference類來保證引用對(duì)象之間的原子性,你可以把多個(gè)變量放在一個(gè)對(duì)象里來進(jìn)行 CAS 操作.所以我們可以使用鎖或者利用AtomicReference類把多個(gè)共享變量合并成一個(gè)共享變量來操作。

五、鎖機(jī)制與InnoDB鎖算法

MyISAM和InnoDB存儲(chǔ)引擎使用的鎖:

  • MyISAM 采用表級(jí)鎖(table-level locking)。
  • InnoDB 支持行級(jí)鎖(row-level locking)和表級(jí)鎖,默認(rèn)為行級(jí)鎖

表級(jí)鎖和行級(jí)鎖對(duì)比:

  • 表級(jí)鎖: Mysql中鎖定 粒度最大 的一種鎖,對(duì)當(dāng)前操作的整張表加鎖,實(shí)現(xiàn)簡(jiǎn)單,資源消耗也比較少,加鎖快,不會(huì)出現(xiàn)死鎖。其鎖定粒度最大,觸發(fā)鎖沖突的概率最高,并發(fā)度最低,MyISAM和 InnoDB引擎都支持表級(jí)鎖。
  • 行級(jí)鎖: Mysql中鎖定 粒度最小 的一種鎖,只針對(duì)當(dāng)前操作的行進(jìn)行加鎖。行級(jí)鎖能大大減少數(shù)據(jù)庫操作的沖突。其加鎖粒度最小,并發(fā)度高,但加鎖的開銷也最大,加鎖慢,會(huì)出現(xiàn)死鎖。

InnoDB存儲(chǔ)引擎的鎖的算法有三種:

  • Record lock:?jiǎn)蝹€(gè)行記錄上的鎖
  • Gap lock:間隙鎖,鎖定一個(gè)范圍,不包括記錄本身
  • Next-key lock:record+gap 鎖定一個(gè)范圍,包含記錄本身

相關(guān)知識(shí)點(diǎn):

  • innodb對(duì)于行的查詢使用next-key lock
  • Next-locking keying為了解決Phantom Problem幻讀問題
  • 當(dāng)查詢的索引含有唯一屬性時(shí),將next-key lock降級(jí)為record key
  • Gap鎖設(shè)計(jì)的目的是為了阻止多個(gè)事務(wù)將記錄插入到同一范圍內(nèi),而這會(huì)導(dǎo)致幻讀問題的產(chǎn)生
  • 有兩種方式顯式關(guān)閉gap鎖:(除了外鍵約束和唯一性檢查外,其余情況僅使用record lock) A. 將事務(wù)隔離級(jí)別設(shè)置為RC B. 將參數(shù)innodb_locks_unsafe_for_binlog設(shè)置為1

六、大表優(yōu)化

當(dāng)MySQL單表記錄數(shù)過大時(shí),數(shù)據(jù)庫的CRUD性能會(huì)明顯下降,一些常見的優(yōu)化措施如下:

1. 限定數(shù)據(jù)的范圍

務(wù)必禁止不帶任何限制數(shù)據(jù)范圍條件的查詢語句。比如:我們當(dāng)用戶在查詢訂單歷史的時(shí)候,我們可以控制在一個(gè)月的范圍內(nèi);

2. 讀/寫分離

經(jīng)典的數(shù)據(jù)庫拆分方案,主庫負(fù)責(zé)寫,從庫負(fù)責(zé)讀;

3. 垂直分區(qū)

根據(jù)數(shù)據(jù)庫里面數(shù)據(jù)表的相關(guān)性進(jìn)行拆分。 例如,用戶表中既有用戶的登錄信息又有用戶的基本信息,可以將用戶表拆分成兩個(gè)單獨(dú)的表,甚至放到單獨(dú)的庫做分庫。

簡(jiǎn)單來說垂直拆分是指數(shù)據(jù)表列的拆分,把一張列比較多的表拆分為多張表。 如下圖所示,這樣來說大家應(yīng)該就更容易理解了。

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

垂直拆分的優(yōu)點(diǎn): 可以使得列數(shù)據(jù)變小,在查詢時(shí)減少讀取的Block數(shù),減少I/O次數(shù)。此外,垂直分區(qū)可以簡(jiǎn)化表的結(jié)構(gòu),易于維護(hù)。

垂直拆分的缺點(diǎn): 主鍵會(huì)出現(xiàn)冗余,需要管理冗余列,并會(huì)引起Join操作,可以通過在應(yīng)用層進(jìn)行Join來解決。此外,垂直分區(qū)會(huì)讓事務(wù)變得更加復(fù)雜;

4. 水平分區(qū)

保持?jǐn)?shù)據(jù)表結(jié)構(gòu)不變,通過某種策略存儲(chǔ)數(shù)據(jù)分片。這樣每一片數(shù)據(jù)分散到不同的表或者庫中,達(dá)到了分布式的目的。水平拆分可以支撐非常大的數(shù)據(jù)量。

水平拆分是指數(shù)據(jù)表行的拆分,表的行數(shù)超過200萬行時(shí),就會(huì)變慢,這時(shí)可以把一張的表的數(shù)據(jù)拆成多張表來存放。舉個(gè)例子:我們可以將用戶信息表拆分成多個(gè)用戶信息表,這樣就可以避免單一表數(shù)據(jù)量過大對(duì)性能造成影響。

 

看這些MySQL的重要知識(shí)點(diǎn),吃透它

 

水平拆分可以支持非常大的數(shù)據(jù)量。需要注意的一點(diǎn)是:分表僅僅是解決了單一表數(shù)據(jù)過大的問題,但由于表的數(shù)據(jù)還是在同一臺(tái)機(jī)器上,其實(shí)對(duì)于提升MySQL并發(fā)能力沒有什么意義,所以 水平拆分最好分庫 。

水平拆分能夠 支持非常大的數(shù)據(jù)量存儲(chǔ),應(yīng)用端改造也少,但 分片事務(wù)難以解決,跨節(jié)點(diǎn)Join性能較差,邏輯復(fù)雜。《Java工程師修煉之道》的作者推薦 盡量不要對(duì)數(shù)據(jù)進(jìn)行分片,因?yàn)椴鸱謺?huì)帶來邏輯、部署、運(yùn)維的各種復(fù)雜度 ,一般的數(shù)據(jù)表在優(yōu)化得當(dāng)?shù)那闆r下支撐千萬以下的數(shù)據(jù)量是沒有太大問題的。如果實(shí)在要分片,盡量選擇客戶端分片架構(gòu),這樣可以減少一次和中間件的網(wǎng)絡(luò)I/O。

下面補(bǔ)充一下數(shù)據(jù)庫分片的兩種常見方案:

  • 客戶端代理: 分片邏輯在應(yīng)用端,封裝在jar包中,通過修改或者封裝JDBC層來實(shí)現(xiàn)。 當(dāng)當(dāng)網(wǎng)的 Sharding-JDBC 、阿里的TDDL是兩種比較常用的實(shí)現(xiàn)。
  • 中間件代理: 在應(yīng)用和數(shù)據(jù)中間加了一個(gè)代理層。分片邏輯統(tǒng)一維護(hù)在中間件服務(wù)中。 我們現(xiàn)在談的 Mycat 、360的Atlas、網(wǎng)易的DDB等等都是這種架構(gòu)的實(shí)現(xiàn)。

 

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-05-17 06:02:58

Css前端CSS 特效

2020-10-14 10:50:50

SpringSessiJavaweb

2019-04-24 16:40:18

Redis數(shù)據(jù)庫

2019-11-25 21:46:12

數(shù)據(jù)湖云計(jì)算數(shù)據(jù)倉庫

2024-09-19 16:00:01

網(wǎng)絡(luò)編程網(wǎng)絡(luò)Python

2018-01-29 15:23:14

網(wǎng)絡(luò)知識(shí)點(diǎn)軟件測(cè)試

2021-04-13 08:25:12

測(cè)試開發(fā)Java注解Spring

2019-07-26 11:27:25

MySQLSQL數(shù)據(jù)庫

2020-02-18 08:01:55

在家辦公Kakfa知識(shí)點(diǎn)大全

2024-02-26 08:19:00

WebSpring容器

2022-08-16 15:17:37

機(jī)器學(xué)習(xí)算法模型

2025-05-19 10:00:00

MySQL數(shù)據(jù)庫InnoDB

2020-02-07 09:59:29

Python異常處理語言

2018-11-28 14:30:09

MySQLL索引設(shè)計(jì)數(shù)據(jù)庫

2023-02-15 08:12:19

http超時(shí)過濾器

2023-10-13 08:52:19

遠(yuǎn)程Bean類型

2010-08-17 14:56:00

HCNE認(rèn)證

2011-04-15 12:25:21

BGP路由

2016-05-30 17:31:34

Spring框架

2021-04-27 22:27:19

手機(jī)安卓蘋果
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美tickling网站挠脚心| 国产精品国产三级国产三级人妇| 久久91亚洲人成电影网站| 亚洲av无码一区东京热久久| 五月天国产在线| 国产精品视频第一区| 99在线热播| 免费又黄又爽又猛大片午夜| 午夜国产精品视频| 亚洲男人的天堂在线播放| 亚洲精品永久视频| 性欧美freesex顶级少妇| 国产精品久久久久影院老司| 国产三区精品| 国产乱码精品一区二三区蜜臂 | 天天想你在线观看完整版电影免费| 黄色av免费观看| 日韩成人av影视| 欧美极品第一页| 中文字幕乱码av| 天天久久夜夜| 精品国一区二区三区| 男人搞女人网站| www成人免费观看| 亚洲色图清纯唯美| 日韩成人av网站| 免费观看a视频| 国内不卡的二区三区中文字幕| 秋霞成人午夜鲁丝一区二区三区| 一区二区在线观看免费视频| 日韩欧美网站| 亚洲女人天堂色在线7777| 女人扒开腿免费视频app| 精品欧美日韩精品| 欧美丝袜一区二区| 国产二区视频在线| 日本动漫同人动漫在线观看| 国产精品成人免费在线| 日韩黄色影视| 日本一本草久在线中文| 国产成人精品无码高潮| 国产精品高清一区二区| 欧美午夜在线观看| 欧美一级黄色影院| 国产欧美一区二区三区精品酒店| 亚洲18女电影在线观看| 91成人综合网| 七七久久电影网| 亚洲黄一区二区三区| 制服诱惑一区| 蜜桃视频在线观看免费视频网站www| 国产三级三级三级精品8ⅰ区| 久久精品国产一区二区三区日韩| 全部免费毛片在线播放一个| 国产成人免费视频一区| 99精品国产高清在线观看| 国产农村妇女毛片精品久久| 国模大尺度一区二区三区| 国产免费观看久久黄| 亚洲特级黄色片| 九九**精品视频免费播放| 成人在线视频网| 国产乱淫a∨片免费观看| 国模少妇一区二区三区 | 国产专区精品| 日韩美女主播在线视频一区二区三区| 午夜视频在线免费看| 亚洲国产欧美国产第一区| 精品少妇一区二区三区日产乱码| 制服丝袜在线第一页| 激情小说亚洲图片| 国产视频精品xxxx| 欧美性受xxxx黑人| 亚洲精品网址| 国语自产精品视频在线看抢先版图片 | 日韩av综合在线观看| 悠悠资源网亚洲青| 欧美亚洲国产bt| www激情五月| 国产精品超碰| 国产一区二区久久精品| 加勒比婷婷色综合久久| 亚洲三级国产| 国产精品久久久久久久久久久不卡| 中文字幕欧美在线观看| 国产精品99久| 欧美日韩一区二区三| 日本韩国在线视频爽| 亚洲欧美视频一区| 欧美一区二区中文字幕| 日韩三级影视| 欧美v日韩v国产v| 久久久久亚洲av成人无码电影| 久久一本综合| 国模gogo一区二区大胆私拍 | 91狠狠综合久久久久久| 欧美日本久久| 国产aaa精品| www.亚洲欧美| 国产喂奶挤奶一区二区三区| 日本一二三区视频在线| 亚洲一二三四| 日韩欧美国产小视频| av女人的天堂| 韩国久久久久| 国产精自产拍久久久久久蜜| 日韩一级片免费在线观看| 国产精品久久久久久久午夜片 | 人交獸av完整版在线观看| 日本高清无吗v一区| aaaaa黄色片| 欧美电影免费播放| 人妖精品videosex性欧美| 国产免费黄色录像| 欧美激情中文不卡| 欧美日韩国产精品激情在线播放| 精品欧美视频| 日韩中文娱乐网| 无码人妻精品一区二区50| 国产成人亚洲综合色影视| 亚洲二区自拍| 91精品韩国| 日韩精品小视频| 日本三级中文字幕| 国产成人免费视频网站| 亚洲人体一区| 外国电影一区二区| 亚洲欧洲xxxx| 91在线视频在线观看| 99在线精品免费| 久久久久久久9| 777久久精品| 久久99久国产精品黄毛片入口| 亚洲一区在线观| 欧美国产精品劲爆| 精品少妇无遮挡毛片| 久久成人av| 国产91精品久| 视频午夜在线| 欧美午夜精品久久久久久浪潮| 丰满人妻一区二区三区免费视频棣| 午夜激情久久| 成人国产精品av| 麻豆av在线导航| 欧美精品1区2区| 小向美奈子av| 国产一区二区在线视频| 国产欧美自拍视频| 久久久久久爱| 欧美激情精品久久久久久蜜臀| 国内精品偷拍视频| 亚洲国产美女搞黄色| 黄色激情在线观看| 免播放器亚洲| 欧美日韩高清在线一区| 日韩三区免费| 日韩中文av在线| 国产富婆一级全黄大片| 亚洲一区中文日韩| 在线免费观看a级片| 亚洲综合三区| 涩涩涩999| 自拍偷拍亚洲| 欧美黑人巨大精品一区二区| 黄色一级大片在线免费看国产一| 亚洲成人精品一区| av在线网站观看| 蜜桃av一区二区三区| 欧美另类videos| 国产女人18毛片水真多18精品| 91chinesevideo永久地址| 经典三级在线| 欧美一级国产精品| 国产乱码久久久久久| 国产午夜精品一区二区三区视频 | 亚洲另类欧美日韩| 久久精品水蜜桃av综合天堂| 中文字幕免费高清在线| 狠狠色综合网| 日本免费高清不卡| 电影一区中文字幕| 91精品成人久久| 91在线观看| 精品国产91亚洲一区二区三区婷婷| 欧美日韩综合在线观看| 国产精品乱码久久久久久| 无套白嫩进入乌克兰美女| 亚洲欧美日韩在线观看a三区| 性欧美精品一区二区三区在线播放 | 91免费看片网站| 精精国产xxxx视频在线中文版| 日韩精品在线观看一区| 国产精品久久久午夜夜伦鲁鲁| 亚洲第一久久影院| 五月婷婷六月香| a亚洲天堂av| 一级网站在线观看| 亚洲免费婷婷| 亚洲中文字幕无码一区二区三区 | 日本一区二区三区dvd视频在线| 精品久久久999| 中文文字幕一区二区三三| 亚洲精品高清视频在线观看| 中文字幕5566| 国产高清精品网站| 91淫黄看大片| 亚洲三级影院| 国产免费一区二区三区四在线播放| 女同一区二区三区| 1卡2卡3卡精品视频| 日韩在线免费| 97精品一区二区三区| 国产在线69| 最近中文字幕日韩精品| 三级在线电影| 亚洲第一福利网| 国产日韩免费视频| 欧美性大战久久久久久久蜜臀| 日韩人妻无码一区二区三区99 | 精品在线播放午夜| 日韩毛片在线免费看| 激情欧美日韩一区| www亚洲国产| 日韩精品中文字幕第1页| 麻豆久久久9性大片| 国产美女撒尿一区二区| 产国精品偷在线| 国产一区 二区| 成人国产精品免费视频| 韩国理伦片久久电影网| 国产成人精品在线播放| 最新中文字幕在线播放| 午夜精品一区二区三区av| 欧美hdxxxxx| 欧美国产日韩视频| 4438x成人网全国最大| 久久久极品av| 超碰在线免费公开| 久久久精品国产一区二区| 免费在线看黄色| y97精品国产97久久久久久| 在线观看免费黄视频| 宅男66日本亚洲欧美视频| av在线电影观看| 最近2019中文字幕一页二页| 97在线观看免费观看高清| 一本一道久久a久久精品逆3p| 国产在线视频福利| 一本大道久久加勒比香蕉| 高清国产福利在线观看| 在线视频亚洲欧美| 日本成人在线播放| 久久精品国产亚洲精品| 天堂va在线| 午夜精品蜜臀一区二区三区免费 | 欧美人xxxx| 国产伦子伦对白视频| 日韩女同互慰一区二区| 国产黄a三级三级看三级| 欧美videossexotv100| 日本加勒比一区| 亚洲精品一二区| 91在线高清| 久久91亚洲精品中文字幕奶水| bl视频在线免费观看| 91成人免费观看网站| 欧美一区久久久| 国产乱肥老妇国产一区二| 清纯唯美激情亚洲| 国产日韩欧美精品| 综合国产视频| 中文字幕中文字幕99| 国产精品videossex久久发布| 国产精品成人久久电影| 久久久精品五月天| 日日干日日操日日射| 国产+成+人+亚洲欧洲自线| 亚洲欧美视频在线播放| 久久一留热品黄| 成年人网站在线观看视频| 亚洲一区二区三区免费视频| 国产视频1区2区| 日韩一区二区三区视频在线观看| 人妻视频一区二区三区| 亚洲午夜精品久久久久久久久久久久 | 国产精品黄色片| 国产精品免费一区二区三区四区 | 国产真人做爰毛片视频直播| 三级久久三级久久久| 美女被艹视频网站| 大桥未久av一区二区三区中文| 国产伦精品一区二区三区视频女| 亚洲精品国产a| 性高潮视频在线观看| 欧美va日韩va| 岛国大片在线观看| 欧美黑人性猛交| 123成人网| 精品999在线观看| 91精品国产调教在线观看| 一女被多男玩喷潮视频| 激情丁香综合五月| 中文人妻一区二区三区| 亚洲激情自拍视频| 中文字幕丰满人伦在线| 亚洲精品二三区| 99福利在线| 国产精品免费久久久久久| 久久国产精品免费精品3p| 中文字幕日韩精品一区二区| 男人的天堂成人在线| 黄页网站在线看| 国产精品成人在线观看| 91在线视频免费播放| 亚洲国产精品va在线看黑人动漫| 老司机午夜在线| 国产精品久久97| 免费看av成人| 青青草成人免费在线视频| 狠狠色狠狠色综合日日91app| 亚洲人成人无码网www国产| 五月婷婷欧美视频| www.天堂av.com| 欧美巨大黑人极品精男| 国产成人福利夜色影视| 欧洲一区二区日韩在线视频观看免费 | 亚洲天堂视频在线| 亚洲少妇中文在线| 91精品论坛| 久久亚洲综合网| 国产乱码精品| 黄色a一级视频| 精品久久久久久久久久久久久久 | 成人激情动漫在线观看| 精品欧美一区二区久久久久| 欧美情侣在线播放| 三区四区电影在线观看| 国产精品久久久一区| 精品色999| 91n.com在线观看| 国产欧美一区二区三区沐欲| 无码人妻aⅴ一区二区三区有奶水| 日韩精品极品在线观看| 亚洲欧美韩国| 久久人人九九| 久久久久久久波多野高潮日日| 国产真实乱人偷精品人妻| 日韩欧美精品中文字幕| 九色在线免费| 国产精品久久久久久久美男| 第一sis亚洲原创| 日本精品一区在线| 亚洲激情图片qvod| 懂色av一区二区三区四区| 久久久影视精品| 日韩精品免费一区二区三区竹菊| 777久久久精品一区二区三区| 久久网这里都是精品| 一级黄色av片| 日韩在线高清视频| 日韩精品一区二区三区中文字幕 | 国产精品久久久久久久精| 日韩午夜三级在线| 2019中文字幕在线电影免费| 久久国产手机看片| 日韩在线卡一卡二| 在线日韩国产网站| 精品国产精品一区二区夜夜嗨 | 91久久久在线| 黄色欧美日韩| 在线观看日本中文字幕| 欧美精品在欧美一区二区少妇 | 国产精品久久久久77777| 91精品综合久久久久久久久久久 | 密臀av一区二区三区| 中文字幕日韩一区二区| 亚洲精品久久久久久无码色欲四季 | 亚洲最大成人av| 九九热这里只有精品免费看| 欧美亚洲国产日韩| 99sesese| 午夜影院在线观看欧美| av网站在线播放| julia一区二区中文久久94| 亚洲在线电影| 欧美激情图片小说| 亚洲精品一区中文| 免费精品一区| 日韩手机在线观看视频| 亚洲黄色录像片| 国产人成在线观看| 99国产超薄肉色丝袜交足的后果 | 日韩女优人人人人射在线视频| 天天综合网91| 国产精品探花一区二区在线观看| 欧美日韩国产一区二区三区地区| 91美女主播在线视频| 亚洲五月六月| 91色porny| 成人黄色免费视频|