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

MySQL 數(shù)據(jù)庫 索引和事務(wù)

 更新時(shí)間:2021年12月07日 11:43:24   作者:吞吞吐吐大魔王  
這篇文章主要介紹了MySQL 數(shù)據(jù)庫 索引和事務(wù),索引是為了加速對(duì)表中數(shù)據(jù)行的檢索而創(chuàng)建的一種分散的存儲(chǔ)結(jié);事物是屬于計(jì)算機(jī)中一個(gè)很廣泛的概念,一般是指要做的或所做的事情,下面我們就一起進(jìn)入文章了解具體內(nèi)容吧

1. 索引

1.1 概念

  • 索引是為了加速對(duì)表中數(shù)據(jù)行的檢索而創(chuàng)建的一種分散的存儲(chǔ)結(jié)構(gòu)。索引是針對(duì)表而建立的,它是由數(shù)據(jù)頁面以外的索引頁面組成的,每個(gè)索引頁面中的行都會(huì)含有邏輯指針,以便加速檢索物理數(shù)據(jù)。
  • 在數(shù)據(jù)庫關(guān)系圖中,可以在選定表的“索引/鍵”屬性頁中創(chuàng)建、編輯或刪除每個(gè)索引類型。當(dāng)保存索引所附加到的表,或保存該表所在的關(guān)系圖時(shí),索引將保存在數(shù)據(jù)庫中。

通俗的講,索引與數(shù)據(jù)庫中的表和數(shù)據(jù)的關(guān)系就類似于書架上的圖書(表)、書籍內(nèi)容(數(shù)據(jù))和書籍目錄(索引)的關(guān)系

1.2 作用

在數(shù)據(jù)庫系統(tǒng)中建立索引主要有以下作用:

  • 快速取數(shù)據(jù)
  • 保證數(shù)據(jù)記錄的唯一性
  • 實(shí)現(xiàn)表與表之間的參照完整性
  • 在使用 order by、group by 子句進(jìn)行數(shù)據(jù)檢索時(shí),利用索引可以減少排序和分組的時(shí)間

1.3 索引的原理

1.3.1 減少磁盤的訪問次數(shù)是構(gòu)建索引的核心思想

索引的目的是方便進(jìn)行查詢。
MySQL 的查詢主要是 selectselect 基本執(zhí)行的過程包括遍歷表、依次取出每個(gè)記錄、根據(jù) where 字句的條件進(jìn)行篩選
由于 MySQL 是把數(shù)據(jù)儲(chǔ)存在硬盤上,因此進(jìn)行查詢時(shí),每次取出記錄都意味著要訪問硬盤
而 IO 設(shè)備對(duì)硬盤的訪問效率遠(yuǎn)低于對(duì)內(nèi)存的訪問,因此減少磁盤的訪問次數(shù)就可以提高查詢的效率,也就是構(gòu)建索引的核心思路

1.3.2 B+ 樹適用實(shí)現(xiàn)索引的底層

減少對(duì)數(shù)據(jù)的訪問次數(shù)就是實(shí)現(xiàn)索引時(shí)的重要思想,接下來將會(huì)對(duì)幾種數(shù)據(jù)結(jié)構(gòu)進(jìn)行分析,以找到更適合的實(shí)現(xiàn)索引的數(shù)據(jù)結(jié)構(gòu)

二叉搜索樹:

由于二叉搜索樹可能是一個(gè)單支樹,時(shí)間復(fù)雜度為 O(N)

AVL 樹:

  • AVL 樹本質(zhì)是一個(gè)二叉平衡搜索樹,是對(duì)二叉搜索樹的一個(gè)改進(jìn),它會(huì)保證了左右子樹的高度差不超過1,即不會(huì)存在單支樹的結(jié)構(gòu),查找時(shí)間復(fù)雜度為 O(logN)
  • 因?yàn)樾枰獫M足左右子樹高度差不超過1的條件,所以插入或者刪除操作會(huì)破壞 AVL 樹的結(jié)構(gòu)。因此需要隨時(shí)對(duì)樹進(jìn)行調(diào)整。雖然查詢效率得到了滿足,但是降低了插入和刪除操作的效率,插入刪除時(shí)間復(fù)雜度為 O(logN)

紅黑樹:

  • 紅黑樹本質(zhì)是一個(gè)放松了規(guī)則的 AVL 樹,即不要強(qiáng)制左右子樹高度差不超過1,會(huì)降低要求,以此來保證插入和刪除操作的效率。
  • 整體和 AVL 樹差異不大,查詢插入刪除的時(shí)間復(fù)雜度為 O(logN)

哈希表:

  • 哈希表可以做到查詢、插入、刪除的時(shí)間復(fù)雜度都是 O(1)
  • 但是哈希表的一個(gè)關(guān)鍵是必須要比較相等,但是形如大于、小于之類的條件無法做到,這就和實(shí)際查詢的情況不符合了

到這里為止,好像只有 AVL 樹或者紅黑樹更加適合用作 MySQL 的索引的實(shí)現(xiàn),而這兩個(gè)數(shù)據(jù)結(jié)構(gòu)的查找效率直接是由樹的高度決定的,因此數(shù)據(jù)增多的話,樹的高度也會(huì)增加。

為了進(jìn)一步優(yōu)化,就可以使用 N 叉搜索樹來降低樹的高度,即減少磁盤 IO,以提高查找效率

B 樹:

B 樹是 N 叉搜索樹的一種

B 樹示例結(jié)構(gòu):

在這里插入圖片描述

用在索引中,每個(gè)結(jié)點(diǎn)都表示一個(gè)記錄

B 樹的特點(diǎn):

  • 每個(gè)結(jié)點(diǎn)可能包含 N 個(gè)子樹
  • 每個(gè)結(jié)點(diǎn)上都可能存在多個(gè)值
  • 左子樹的值都小于根節(jié)點(diǎn)的對(duì)應(yīng)值,右子樹的值都大于根節(jié)點(diǎn)的對(duì)應(yīng)值

B+ 樹:

B+ 樹是一種特殊的 N 叉搜索樹,是 B 樹的改進(jìn)版

B+ 樹示例結(jié)構(gòu):

在這里插入圖片描述

?B+ 樹相對(duì)于 B 樹的改進(jìn):

  • 葉子節(jié)點(diǎn)存儲(chǔ)每行記錄,非葉子節(jié)點(diǎn)只要存儲(chǔ)每行的索引值即可
  • 非葉子節(jié)點(diǎn)的值存在重復(fù),使得葉子結(jié)點(diǎn)這一層是完整的數(shù)據(jù)集合
  • 可以通過類似于鏈表的方式,把所有的葉子節(jié)點(diǎn)連接起來

B+ 樹的優(yōu)勢(shì):

  • 善于進(jìn)行范圍查找
  • 由于所有的查詢都是落在葉子結(jié)點(diǎn)上,故查詢的速度是比較穩(wěn)定的
  • 由于葉子結(jié)點(diǎn)是數(shù)據(jù)的全集,因此就可以把葉子結(jié)點(diǎn)存到硬盤上,非葉子結(jié)點(diǎn)直接存到內(nèi)存中,大大降低了讀取硬盤的次數(shù)

1.4 適用場(chǎng)景

  • 查找的次數(shù)比較多,插入刪除的次數(shù)較少適合用索引
  • 由于索引本身也占據(jù)一定空間,如果磁盤緊張就不太適合用索引
  • 索引是指定某個(gè)列來建立的,當(dāng)某列的區(qū)分度比較大的時(shí)候,適合用索引,例如自增主鍵

1.5 使用語句

補(bǔ)充:

創(chuàng)建主鍵約束(primary key)、唯一約束(unique)、外鍵約束(foreign key)時(shí),會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)列的索引

1.5.1 查看索引

語法:

show index from 表名;

示例:

在這里插入圖片描述

1.5.2 創(chuàng)建索引

語法:

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

示例:

在這里插入圖片描述

1.5.3 刪除索引

語法:

drop index 索引名 on 表名;

示例:

在這里插入圖片描述

注意:

主索引不能刪除,刪除會(huì)報(bào)錯(cuò)

2. 事務(wù)

2.1 概念

事物:是屬于計(jì)算機(jī)中一個(gè)很廣泛的概念,一般是指要做的或所做的事情。在關(guān)系數(shù)據(jù)庫中,一個(gè)事務(wù)可以是一條 SQL 語句或者一組 SQL 語句或整個(gè)程序。

通俗的講,比如銀行轉(zhuǎn)賬的操作,A 轉(zhuǎn)給 B 500元,那么這個(gè)操作其實(shí)包含了 A 賬戶余額減少500元和 B 賬戶余額增加500元兩個(gè)操作。

事物就相當(dāng)于將這一連串的動(dòng)作給打包,使其成為一個(gè)整體,要么全都不做,要么全都做完

2.2 為什么使用事務(wù)

用上述銀行轉(zhuǎn)賬的例子為例,假設(shè) A 賬戶減少500元的操作成功了,但 B 賬戶增加500元的賬戶沒有成功,那么這個(gè)轉(zhuǎn)賬的操作是失敗的。

事物的核心特點(diǎn)就是: 把一系列操作給打包到一起,構(gòu)成一個(gè)整體,要么全都做完,要么一個(gè)都不做。

全都不做是指: 如果某個(gè)操作失敗了,那么就會(huì)將此時(shí)的中間狀態(tài)偷偷還原回去

因此使用事物的話就可以保證,某一系列的操作,不會(huì)只完成其中一部分,它要么完全完成,要么都沒有完成

2.3 四大屬性

事務(wù)是恢復(fù)和并發(fā)控制的基本單位,它具有四個(gè)屬性:原子性、一致性、持久性、隔離性

事物的核心是原子性

2.3.1 原子性

概念:

一個(gè)事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中包括的操作要么都做,要么都不做。

事物的核心是原子性,原子性的核心是回退為中間狀態(tài),回退為中間狀態(tài)核心就是回滾,回滾的核心就是記住每步的操作

2.3.2 一致性

概念:

事務(wù)必須是使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。一致性與原子性是密切相關(guān)的。

執(zhí)行事物之前和執(zhí)行事物完成后,當(dāng)前表里的數(shù)據(jù)都是合理的狀態(tài)

2.3.3 持久性

概念:

持久性也稱永久性(permanence),指一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對(duì)其有任何影響。

事物操作的數(shù)據(jù)都是直接操作硬盤,而硬盤的數(shù)據(jù)都是持久化的

2.3.4 隔離性

概念:

一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。

2.4 使用方法

開啟事物:

start transaction;


執(zhí)行多條 SQL 語句

回滾或提交

-- 回滾:表示上述 SQL 語句全部失敗
rollback;

-- 提交:表示上述 SQL 語句全部成功
commit;

到此這篇關(guān)于MySQL 數(shù)據(jù)庫 索引和事務(wù)的文章就介紹到這了,更多相關(guān)MySQL 索引和事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何恢復(fù)MySQL主從數(shù)據(jù)一致性

    如何恢復(fù)MySQL主從數(shù)據(jù)一致性

    MySQL主從數(shù)據(jù)一致性怎么恢復(fù),MySQL主從數(shù)據(jù)庫的數(shù)據(jù)不一致,猜測(cè)備庫在同步過程中出現(xiàn)了問題,現(xiàn)在的問題很明確,就是如何恢復(fù)主從庫數(shù)據(jù)的一致性,下文為大家分享解決方法,感興趣的小伙伴們可以參考一下
    2016-04-04
  • MySql查詢某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)實(shí)例(前一周、前三個(gè)月、前一年等)

    MySql查詢某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)實(shí)例(前一周、前三個(gè)月、前一年等)

    在實(shí)際工作中需要整理一份時(shí)間在規(guī)定時(shí)間前后的統(tǒng)計(jì)表,下面這篇文章主要給大家介紹了關(guān)于MySql查詢某個(gè)時(shí)間段內(nèi)的數(shù)據(jù)的相關(guān)資料,包括前一周、前三個(gè)月、前一年等,需要的朋友可以參考下
    2022-10-10
  • 關(guān)于pt-archiver和自增主鍵的那些事

    關(guān)于pt-archiver和自增主鍵的那些事

    mysql是我們經(jīng)常會(huì)用到的一個(gè)數(shù)據(jù)庫,mysql數(shù)據(jù)庫中有一個(gè)主鍵生成規(guī)則,就是自增,這篇文章主要給大家介紹了關(guān)于pt-archiver和自增主鍵的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Mysql文件存儲(chǔ)圖文詳解

    Mysql文件存儲(chǔ)圖文詳解

    文件存儲(chǔ)是我們?nèi)粘i_發(fā)中經(jīng)常遇到的一個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Mysql文件存儲(chǔ)的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • mysql單字段多值分割和合并的處理方法

    mysql單字段多值分割和合并的處理方法

    這篇文章主要給大家介紹了關(guān)于mysql單字段多值分割和合并的處理方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)

    MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例(首字的首字母)

    這篇文章主要介紹了MySQL中文漢字轉(zhuǎn)拼音的自定義函數(shù)和使用實(shí)例,需要的朋友可以參考下
    2014-06-06
  • mysql查看死鎖與去除死鎖示例詳解

    mysql查看死鎖與去除死鎖示例詳解

    這篇文章主要給大家介紹了關(guān)于mysql查看死鎖與去除死鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • mysql?8.0.26?安裝配置方法圖文教程

    mysql?8.0.26?安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql?8.0.26?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • MySQL備份與恢復(fù)之熱拷貝(4)

    MySQL備份與恢復(fù)之熱拷貝(4)

    熱拷貝支持服務(wù)運(yùn)行中進(jìn)行備份,速度快,性能好,但它的劣勢(shì)在于只能備份MyIsam的表,無法備份InnoDB的表,對(duì)熱拷貝感興趣的朋友可以參考一下這篇文章
    2015-08-08
  • 數(shù)據(jù)庫設(shè)計(jì)工具M(jìn)ySQL?Workbench使用教程(超級(jí)詳細(xì)!)

    數(shù)據(jù)庫設(shè)計(jì)工具M(jìn)ySQL?Workbench使用教程(超級(jí)詳細(xì)!)

    MySQL?Workbench為數(shù)據(jù)庫管理員、程序開發(fā)者和系統(tǒng)規(guī)劃師提供可視化的Sql開發(fā)、數(shù)據(jù)庫建模、以及數(shù)據(jù)庫管理功能,下面這篇文章主要給大家介紹了關(guān)于MySQL設(shè)計(jì)工具Workbench使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論