欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫(kù)的事務(wù)和索引詳解

 更新時(shí)間:2021年10月11日 09:48:45   作者:龍弟-idea  
這篇文章主要介紹了MySql 索引和事務(wù),總結(jié)分析了mysql數(shù)據(jù)庫(kù)中關(guān)于索引和事務(wù)的概念、原理、知識(shí)點(diǎn)及相關(guān)注意事項(xiàng),需要的朋友可以參考下

一、事務(wù):

事務(wù)是邏輯上的一組操作,要么都成功,要么都失敗!

——————————————————————————————————

1、SQL執(zhí)行        A:1000元     ——>轉(zhuǎn)賬200元        B:200元

2、SQL執(zhí)行        A:800元       ——>                        B:400元

——————————————————————————————————

將一組SQL放在一個(gè)批次中執(zhí)行

事務(wù)四大特性:

ACID原則

1.原子性(AtomIclty)︰事務(wù)是最小的執(zhí)行單位,不允許分割。事務(wù)的原子性確保動(dòng)作要么全部完成,要么完全不起作用;


2.一致性(Conslstency):執(zhí)行事務(wù)前后,數(shù)據(jù)保持一致,多個(gè)事務(wù)對(duì)同一個(gè)數(shù)據(jù)讀取的結(jié)果是相同的;


3.隔離性(Isolatlon)︰并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),一個(gè)用戶的事務(wù)不被其他事務(wù)所干擾,各并發(fā)事務(wù)之間數(shù)據(jù)庫(kù)是獨(dú)立的;


4.持久性(Durabllty) :一個(gè)事務(wù)被提交之后。它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變是持久的,即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。 --------事務(wù)提交

并發(fā)事務(wù)帶來(lái)哪些問(wèn)題?(隔離所導(dǎo)致的一些問(wèn)題)

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

 臟讀(DIrty read) :當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù)并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí)另外一個(gè)事務(wù)也訪問(wèn)了這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是"臟數(shù)據(jù)",依據(jù)"臟數(shù)據(jù)"所做的操作可能是不正確的。


丟失修改(Lost to modlify):指在一個(gè)事務(wù)讀取一個(gè)數(shù)據(jù)時(shí),另外一個(gè)事務(wù)也訪問(wèn)了該數(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ù)還沒(méi)有結(jié)束時(shí),另一個(gè)事務(wù)也訪問(wèn)該數(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ā)生了幻覺(jué)一樣,所以稱為幻讀。

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

不可重復(fù)讀的重點(diǎn)是修改比如多次讀取一條記錄發(fā)現(xiàn)其中某些列的值被修改,幻讀的重點(diǎn)在于新增或者刪除比如多次讀取一條記錄發(fā)現(xiàn)記錄增多或減少了。

事務(wù)隔離級(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)生干擾,也就是說(shuō),該級(jí)別可以防止臟讀、不可重復(fù)讀以及幻讀。

MySQL的默認(rèn)隔離級(jí)別:

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

二、索引:

MySQL官方對(duì)索引的定義為:索引 (Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。提取句子主干,就可以得到索引的本質(zhì):索引是數(shù)據(jù)結(jié)構(gòu)。

MySQL索引使用的數(shù)據(jù)結(jié)構(gòu)主要有BTree索引和哈希索引。對(duì)于哈希索引來(lái)說(shuō),底層的數(shù)據(jù)結(jié)構(gòu)就是哈希表,因此在絕大多數(shù)需求為單條記錄查詢的時(shí)候,可以選擇哈希索引,查詢性能最快;其余大部分場(chǎng)景,建議選擇BTree索引。

MySQL的BTree索引使用的是B樹(shù)中的B+Tree,但對(duì)于主要的兩種存儲(chǔ)引擎的實(shí)現(xiàn)方式是不同的。

MyISAM: B+Tree葉節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址。在索引檢索的時(shí)候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址讀取相應(yīng)的數(shù)據(jù)記錄。這被稱為“非聚簇索引”。

InnoDB:其數(shù)據(jù)文件本身就是索引文件。相比MyISAM,索引文件和數(shù)據(jù)文件是分離的,其表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu),樹(shù)的葉節(jié)點(diǎn)data域保存了完整的數(shù)據(jù)記錄。這個(gè)索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。這被稱為“聚簇索引(或聚集索引)”。而其余的索引都作為輔助索引,輔助索引的data域存儲(chǔ)相應(yīng)記錄主鍵的值而不是地址,這也是和MyISAM不同的地方。在根據(jù)主索引搜索時(shí),直接找到key所在的節(jié)點(diǎn)即可取出數(shù)據(jù);在根據(jù)輔助索引查找時(shí),則需要先取出主鍵的值,再走一遍主索引。因此,在設(shè)計(jì)表的時(shí)候,不建議使用過(guò)長(zhǎng)的字段作為主鍵,也不建議使用非單調(diào)的字段作為主鍵,這樣會(huì)造成主索引頻繁分裂。

索引的作用:

  • 提高查詢速度
  • 確保數(shù)據(jù)的唯一性
  • 可以加速表和表之間的連接 , 實(shí)現(xiàn)表與表之間的參照完整性
  • 使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí) , 可以顯著減少分組和排序的時(shí)間
  • 全文檢索字段進(jìn)行搜索優(yōu)化.

索引的分類:

  • 主鍵索引 (Primary Key)

唯一的標(biāo)識(shí),主鍵不可重復(fù),只能有一個(gè)列作為主鍵

  • 唯一索引 (Unique)

避免重復(fù)的列出現(xiàn),唯一索引可以重復(fù),多個(gè)列都可以標(biāo)識(shí)位唯一索引

  • 常規(guī)索引 (Index)

默認(rèn)的, index或key關(guān)鍵字來(lái)設(shè)置

  • 全文索引 (FullText)

在特定的數(shù)據(jù)庫(kù)引擎下才有,MylSAM

快速定位數(shù)據(jù)

索引準(zhǔn)則:

  • 索引不是越多越好
  • 不要對(duì)經(jīng)常變動(dòng)的數(shù)據(jù)加索引
  • 小數(shù)據(jù)量的表建議不要加索引
  • 索引一般應(yīng)加在查找條件的字段

索引的數(shù)據(jù)結(jié)構(gòu):

-- 我們可以在創(chuàng)建上述索引的時(shí)候,為其指定索引類型,分兩類
hash類型的索引:查詢單條快,范圍查詢慢
btree類型的索引:b+樹(shù),層數(shù)越多,數(shù)據(jù)量指數(shù)級(jí)增長(zhǎng)(我們就用它,因?yàn)閕nnodb默認(rèn)支持它)
-- 不同的存儲(chǔ)引擎支持的索引類型也不一樣
InnoDB 支持事務(wù),支持行級(jí)別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事務(wù),支持表級(jí)別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事務(wù),支持表級(jí)別鎖定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事務(wù),支持行級(jí)別鎖定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事務(wù),支持表級(jí)別鎖定,不支持 B-tree、Hash、Full-text 等索引;

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • MYSQL隨機(jī)抽取查詢 MySQL Order By Rand()效率問(wèn)題

    MYSQL隨機(jī)抽取查詢 MySQL Order By Rand()效率問(wèn)題

    MYSQL隨機(jī)抽取查詢:MySQL Order By Rand()效率問(wèn)題一直是開(kāi)發(fā)人員的常見(jiàn)問(wèn)題,俺們不是DBA,沒(méi)有那么牛B,所只能慢慢研究咯,最近由于項(xiàng)目問(wèn)題,需要大概研究了一下MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法
    2011-11-11
  • 解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘root‘@‘localhost‘?(using?password:?NO)的方法

    解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘roo

    最近在我們連接數(shù)據(jù)庫(kù)的時(shí)候遇到個(gè)問(wèn)題,感覺(jué)還挺容易遇到的,所以總結(jié)下,這篇文章主要給大家介紹了關(guān)于解決Mysql:ERROR?1045?(28000):Access?denied?for?user?‘root‘@‘localhost‘?(using?password:?NO)的方法,需要的朋友可以參考下
    2022-06-06
  • mysql 8.0.15 winx64解壓版安裝配置方法圖文教程

    mysql 8.0.15 winx64解壓版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.15 winx64解壓版安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 在MySQL中生成隨機(jī)密碼的方法

    在MySQL中生成隨機(jī)密碼的方法

    這篇文章主要介紹了在MySQL中生成隨機(jī)密碼的方法,作者還給出了密碼所對(duì)應(yīng)類型限制的參數(shù)表,需要的朋友可以參考下
    2015-05-05
  • 年底了,你的mysql密碼安全嗎

    年底了,你的mysql密碼安全嗎

    這篇文章主要介紹了MySQL密碼安全的相關(guān)知識(shí),幫助大家更好的使用數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-01-01
  • mysql存儲(chǔ)過(guò)程事務(wù)管理簡(jiǎn)析

    mysql存儲(chǔ)過(guò)程事務(wù)管理簡(jiǎn)析

    本文將提供了一個(gè)絕佳的機(jī)制來(lái)定義、封裝和管理事務(wù),需要的朋友可以參考下
    2012-11-11
  • 詳解MySQL事務(wù)的隔離級(jí)別與MVCC

    詳解MySQL事務(wù)的隔離級(jí)別與MVCC

    這篇文章主要介紹了MySQL事務(wù)的隔離級(jí)別與MVCC的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • mysql 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)樹(shù)節(jié)點(diǎn)的獲取方法

    mysql 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)樹(shù)節(jié)點(diǎn)的獲取方法

    這篇文章主要介紹了mysql 使用存儲(chǔ)過(guò)程實(shí)現(xiàn)樹(shù)節(jié)點(diǎn)的獲取方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • MYSQL?Binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)詳解

    MYSQL?Binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)詳解

    MySQL一旦誤刪數(shù)據(jù)庫(kù)之后恢復(fù)數(shù)據(jù)很麻煩,這里記錄一下艱辛的恢復(fù)過(guò)程,這篇文章主要給大家介紹了關(guān)于如何利用MySQL的binlog恢復(fù)誤刪數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Mysql配置my.ini文件的簡(jiǎn)單成功版本

    Mysql配置my.ini文件的簡(jiǎn)單成功版本

    my.ini是MySQL數(shù)據(jù)庫(kù)中使用的配置文件,修改這個(gè)文件可以達(dá)到更新配置的目的,下面這篇文章主要給大家介紹了關(guān)于Mysql配置my.ini文件的簡(jiǎn)單成功版本,需要的朋友可以參考下
    2023-04-04

最新評(píng)論