MySQL索引事務基礎

目錄

1. 索引

1.1索引的概念

1.2索引的特點

1.3?索引的使用場景

?1.4索引的使用

1.4.1查看索引

1.4.2創建索引

?1.4.3刪除索引

?1.5索引保存的數據結構

2.事務

2.1經典例子

2.2事務的概念

2.3事務的使用

2.4事務的4個核心特性

2.5事務的并發問題

2.5.1臟讀

2.5.2不可重復讀

2.5.3幻讀


1. 索引

1.1索引的概念

索引是一種特殊的文件,包含著對數據表里所有記錄的引用指針。可以對表中的一列或多列創建索引, 并指定索引的類型,各類索引有各自的數據結構實現。

1.2索引的特點

(1)加快查詢的速度。

(2)索引自身也是數據結構,也需要存儲空間。

(3)當我們需要進行新增,刪除,修改時,索引也需要更新(額外的開銷)。

1.3?索引的使用場景

要考慮對數據庫表的某列或某幾列創建索引,需要考慮以下幾點:
1.數據量較大,且經常對這些列進行條件查詢。
2.該數據庫表的插入操作,及對這些列的修改操作頻率較低。
3.有足夠大的磁盤空間,因為索引會占用額外的磁盤空間。
滿足以上條件時,考慮對表中的這些字段創建索引,以提高查詢效率。
反之,如果非條件查詢列,或經常做插入、修改操作,或磁盤空間不足時,不考慮創建索引。

?1.4索引的使用

創建主鍵約束(PRIMARY KEY)、唯一約束(UNIQUE)、外鍵約束(FOREIGN KEY)時,會自動創建 對應列的索引。

使用博主已經建立好的student表。

1.4.1查看索引

語法:

show index from 表名;

查看某個表是否有索引,以及有幾個索引。

展示:

顯示指定表中所有索引的詳細信息

包括索引名稱(Key_name)、索引列(Column_name)、是否是唯一索引(Non_unique)、排序方式(Collation)、索引的基數(Cardinality)等。

1.4.2創建索引

對于非主鍵、非唯一約束、非外鍵的字段,可以創建普通索引,普通索引是最常見的索引類型,用于加速對表中數據的查詢。

語法:

create index 索引名 on 表名(字段名);

意思是:在那個表的那給字段上添加索引。

展示:

?1.4.3刪除索引

語法:

drop index 索引名 on 表名;

展示:

?

?1.5索引保存的數據結構

索引保存的數據結構主要為B+樹

B+樹的特點:

(1)為N叉二叉樹,每個節點有n個key,n個key劃分出n個區間。

(2)每個節點的n個key中,會存在最大(小)值。

(3)每個節點的key,都會在子樹中重復出現。

(4)葉子節點之間使用鏈式結構相連。

結構如下:

是B-Tree的改進版本,同時也是數據庫索引索引所采用的存儲結構。數據都在葉子節點上,并且增加了順序訪問指針,每個葉子節點都指向相鄰的葉子節點的地址。相比B-Tree來說,進行范圍查找時只需要查找兩個節點,進行遍歷即可。而B-Tree需要獲取所有節點,相比之下B+Tree效率高。

?為什么索引結構默認使用B-Tree,而不是hash,二叉樹,紅黑樹?

hash:雖然可以快速定位,但是沒有順序,IO復雜度高。
二叉樹:樹的高度不均勻,不能自平衡,查找效率跟數據有關(樹的高度),并且IO代高。
紅黑樹:樹的高度隨著數據量增加而增加,IO代價高。

?使用B+樹的好處:

(1)所有數據都包含在葉子節點這一層中(數據全集數)進行范圍查詢時,只要找到對應初始位置,之后沿鏈表遍歷即可。

(2)查詢時間穩定。查詢任意一個元素,都要從根節點查詢到子節點。(穩定比單純的快更有用)

(3)葉子節點這一層是數據全集數,故只存葉子節點在數據行,其他節點可以在緩存區。


2.事務

2.1經典例子

準備測試表:
drop table if exists accout;
create table accout(
id int primary key auto_increment,
name varchar ( 20 ) comment ' 賬戶名稱 ' ,
money decimal ( 11 , 2 ) comment ' 金額 '
);
insert into accout(name, money) values
( ' 阿里巴巴 ' , 5000 ),
( ' 四十大盜 ' , 1000 );

比如說,四十大盜把從阿里巴巴的賬戶上偷盜了2000?

--阿里巴巴賬戶減少2000
update accout set money=money- 2000 where name = ' 阿里巴巴 ' ;
-- 四十大盜賬戶增加 2000
update accout set money=money+ 2000 where name = ' 四十大盜 ' ; ?
假如在執行以上第一句 SQL 時,出現網絡錯誤,或是數據庫掛掉了,阿里巴巴的賬戶會減少 2000 ,但是 四十大盜的賬戶上就沒有了增加的金額。
解決方案:使用事務來控制,保證以上兩句 SQL 要么全部執行成功,要么全部執行失敗。

?

2.2事務的概念

事務指邏輯上的一組操作,組成這組操作的各個單元, 要么全部成功,要么全部失敗 。 在不同的環境中,都可以有事務。對應在數據庫中,就是數據庫事務。
對“要么全部失敗”的解釋:其實語句都執行了,只不過是復原到最初。

2.3事務的使用

1 )開啟事務: start transaction;
(2)執行多條 SQL 語句
3 )回滾或提交: rollback/commit;

commit會提交事務,并使已對數據庫進行的所有修改成為永久性的;?

rollback會結束用戶的事務,并撤銷正在進行的所有未提交的修改;

只要沒有commit,數據庫就可以rollback復原到開始。?

?舉例:

start transaction;
-- 阿里巴巴賬戶減少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盜賬戶增加2000
update accout set money=money+2000 where name = '四十大盜';
commit;

2.4事務的4個核心特性

(1)原子性:通過事務把多個操作打包在一起。

(2)一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。

(3)事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。

(4)隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。

2.5事務的并發問題

2.5.1臟讀

概念:一個事務讀到另一個事務還沒有提交的數據

案例:

事務A修改了原來的數據但未提交,事務B讀了事務A修改的數據提交了,但事務A進行了回滾,事務B就讀了假數據。

解決:給操作加鎖(在放鎖之前不可訪問),也就是寫時不讓讀,寫完才讓讀。

2.5.2不可重復讀

概念:一個事務先后讀取相同的數據,但兩次讀取的數據不同。

圖示:

解決:給讀操作也加鎖,也就是讀的時候也不讓寫。

2.5.3幻讀

概念:一個事務按照條件查詢時,此時無對應的數據行,但插入時又發現數據已經存在。

圖示:?

解決:串行化,不再進行任何并發。

2.6事務隔離級別

事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。

(1)未提交(Read uncommitted)

并發程度最高,隔離程度最低,效果最高,數據最不靠譜。可能出現臟讀,不可重復讀,幻讀。

(2)讀提交(read committed)

相當給寫操作加鎖,可能出現不可重復讀,幻讀。

(3)可重復讀(repeatable read)

相當給寫和讀操作都加鎖,可能出現幻讀。

(4)串行化(Serializable)

并發程度最低,隔離程度最高,效果最低,數據最靠譜。?


都看到這了,不如關注一下,給個免費的贊?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165089.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python + Docker 還是 Rust + WebAssembly?

在不斷發展的技術世界中,由大語言模型驅動的應用程序,通常被稱為“LLM 應用”,已成為各種行業技術創新背后的驅動力。隨著這些應用程序的普及,用戶需求的大量涌入對底層基礎設施的性能、安全性和可靠性提出了新的挑戰。 Python 和…

Java項目如何打包成Jar(最簡單)

最簡單的辦法,使用Maven插件(idea自帶) 1.選擇需要打包的mudule,點擊idea右側的maven插件 2.clean操作 3.選擇需要的其他mudule,進行install操作(如果有) 4.再次選擇需要打包的module&#…

Vue.observable 是什么

Observable 翻譯過來我們可以理解成可觀察的 Vue.js2.6 新增 Vue.observable,讓一個對象變成響應式數據。Vue 內部會用它來處理 data 函數返回的對象 。 返回的對象可以直接用于渲染函數和計算屬性內,并且會在發生變更時觸發相應的更新。也可以作為最小化…

Git的指令

Git 各平臺安裝包下載地址為:http://git-scm.com/downloads Ubuntu Git 安裝命令為: $ apt-get install git用戶信息 配置個人的用戶名稱和電子郵件地址: $ git config --global user.name "runoob" $ git config --global user.…

Python----類對象和實例對象

目錄 一.類和類的實例 二.類屬性和實例屬性 三.私有屬性和公有屬性 四.靜態方法和類方法 五.__init__方法,__new__方法和__del__方法: 六.私有方法和公有方法 七.方法的重載 八.方法的繼承 九.方法的重寫 十.對象的特殊方法 十一.對象的引用&a…

軟件開發模式開源和閉源的優劣之爭

開源和閉源,兩種截然不同的開發模式,對于大模型的發展有著重要影響。開源讓技術共享,吸引了眾多人才加入,推動了大模的創新。而閉源則保護了商業利益和技術優勢,為大模型的商業應用提供了更好的保障。 開源與閉源軟件的…

基于命令行模式設計退款請求處理

前言 這篇文章的業務背景是基于我的另一篇文章: 對接蘋果支付退款退單接口-CSDN博客 然后就是說設計模式是很開放的東西,可能我覺得合適,你可能覺得不合適,這里只是做下討論,沒有一定要各位同意的意思.... 相關圖文件 這里我先把相關的圖文件放上來,可能看著會比較清晰點 代碼邏…

sql之left join、right join、inner join的區別

sql之left join、right join、inner join的區別 left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄 inner join(等值連接) 只返回兩個表中聯結字段相等的行 舉例如下&#xff1…

Web服務器(go net/http) 處理Get、Post請求

大家好 我是寸鐵👊 總結了一篇Go Web服務器(go net/http) 處理Get、Post請求的文章? 喜歡的小伙伴可以點點關注 💝 前言 go http請求如何編寫簡單的函數去拿到前端的請求(Get和Post) 服務器(后端)接收到請求后,又是怎么處理請求&#xff0c…

【限時免費】20天拿下華為OD筆試之【前綴和】2023B-尋找連續區間【歐弟算法】全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入描述輸出描述示例一輸入輸出說明 示例二輸入輸出 解題思路代碼PythonJavaC時空復雜度 華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描述 給定一個含有N個正整數的數組,求出有多少個連續區間(包…

【網絡奇緣】- 計算機網絡|分層結構|ISO模型

🌈個人主頁: Aileen_0v0🔥系列專欄: 一見傾心,再見傾城 --- 計算機網絡~💫個人格言:"沒有羅馬,那就自己創造羅馬~" 目錄 計算機網絡分層結構 OSI參考模型 OSI模型起源 失敗原因: OSI模型組成 協議的作用 📝全文…

二十四、RestClient操作文檔

目錄 一、新增文檔 1、編寫測試代碼 二、查詢文檔 1、編寫測試代碼 三、刪除文檔 1、編寫測試代碼 四、修改文檔 1、編寫測試代碼 五、批量導入文檔 批量查詢 一、新增文檔 1、編寫測試代碼 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

【棧】不同字符的最小子序列

題目: /*** 思路:棧,使用數組記錄每個字母出現的次數,再用一個數組標記字符是否在棧中* 遍歷棧,存儲字符時比較棧頂字符,若小于棧頂字符并且后面有重復的字符則* 棧頂元素出棧,否則入棧。** au…

PS 注釋工具 基礎使用方法講解

好 上文PS 顏色取樣器&標尺工具 基本使用講解中 我們講了 顏色取樣器和標尺工具的基本用法 下面我們來看一下 注釋工具 這個 主要是后面 比較大的作品 可能不是我們一個人取設計 團隊作圖 就需要用到它 選擇 注釋工具 后 我們隨便點擊圖像任何一個位置 右側就會出現一個輸…

gitlab各版本安裝注意點:

研發團隊在安裝gitlab各版本過程中可能遇到各種問題,為了后續容易查看特將我們在實踐過程中遇到的各類問題要點總結如下: gitlab 10.8.3 (564c342)安裝 centos Linux yum安裝網址查找網址:gitlab/gitlab-ce - Results for gitla…

執行shell腳本提示syntax error: unexpected end of file

具體報錯如下: ./test.sh: line 36: syntax error: unexpected end of file執行命令時需將test.sh替換為實際的腳本文件名稱。 情形一: shell腳本在Windows下編寫,上傳到Linux上執行,由于 fileformat 類型不同,所以報…

黑馬點評12-實現好友關注/取關功能,查看好友共同關注列表

好友關注 數據模型 數據庫中的tb_follow記錄博主與粉絲的關系 tb_follow表對應的實體類 Data EqualsAndHashCode(callSuper false) Accessors(chain true) TableName("tb_follow") public class Follow implements Serializable {private static final long ser…

代碼隨想錄算法訓練營第三十二天| 122 買賣股票的最佳時機 || 55 跳躍游戲 45 跳躍游戲 ||

目錄 122 買賣股票的最佳時機 || 55 跳躍游戲 45 跳躍游戲 || 122 買賣股票的最佳時機 || 設置變量now代表此時買入的股票,為賦值為Integer.MAX_VALUE,遍歷prices數組,有如下兩種情況: 如果比now小說明不能售出,可以…

關于unicloud云對象或云函數獲取時間不對的問題

話不多說,直接上代碼: function timeWeekFormat() { //定義一個日期對象; var dateTime getOffsetDate(8); //獲得系統年份; var year dateTime.getFullYear(); //獲得系統月份; var month dateTime.getMonth() 1; //獲…

棧和隊列的OJ題--12.括號匹配

12.括號匹配 20. 有效的括號 - 力扣(LeetCode) 解題思路:該題比較簡單,是對棧特性很好的應用,具體操作如下:循環遍歷String中的字符,逐個取到每個括號,如果該括號是:1. …