【MySQL高級】事務,存儲引擎,索引(一)

Mysql高級

DQL查詢語句

反引號

image-20250414074629964

模糊查詢避免%出現在開頭,會造成索引失效

order by排序先后

image-20250413110219322

image-20250414072444951

表名列名都需要用${},他們不能帶’’


去重+統計數量

image-20250413110318319

image-20250414072123779


null的運算

image-20250413110601023

分組函數會自動忽略null,不用對null進行處理


截取子串substr(字段,下標,截取長度)

下標從1開始

image-20250413110900025


trim去重字段空格

image-20250413111007763


now()

image-20250413111315490


分組函數和分組查詢group by

image-20250413111907510

image-20250413111852126

image-20250413111923464

可以聯合分組

image-20250413111947966


having和where區別和使用

having可以用分組函數,但是必須先group by 分組后再用having過濾

而where不可以用分組函數,必須先過濾后用group by 分組

image-20250413112712140

image-20250413112542748

where效率比having高

因為執行順序,先where后group by 后 having

在這里插入圖片描述
image-20250414071249539


連接查詢

笛卡爾積,直接from 兩張表,沒有join和on條件(外鍵),直接n*n行查詢,效率慢

image-20250414081954719

image-20250414070059519

執行順序先from后select

on條件相等,一般為外鍵

image-20250414070157215

非等值查詢


自連接

image-20250414070336657

外連接

image-20250414070450763

主次關系,需要把員工名全查出來,捎帶查領導


多表連接

image-20250414070616777

子查詢(select嵌套)

image-20250414072237104

where中子查詢

image-20250414072251865

DML增刪改語句

在這里插入圖片描述
image-20250414073108558

image-20250414073143004


事務

事務的本質就是多條DML語句同時成功或者同時失敗

image-20250414075348118

每一句DML語句都會儲存在日志文件
提交事務commit或者回滾事務rollback,都會清空日志文件
commit提交到表中(硬盤中),rollback回滾到上次提交,都是結束事務的標志

事務的特性

image-20250414160539197


事務的隔離級別

image-20250414075901639

重復:同一事務中,對相同數據進行多次讀取

不可重復讀

image-20250414075928139

也就是事務先讀取a,被別的事務修改了,再讀取同一條記錄,得到的結果不一樣,所以不可重復讀

在這里插入圖片描述

每次讀到的數據都一樣,可重復讀會給讀取的數據加鎖,其他事務無法修改這個數據

幻讀就是第一次讀取a,發現不存在,于是insert 這個a,發現insert失敗,這時候就是另一個事務已經insert了這個a

但是第二次讀取a,發現還是不存在,依舊insert失敗,好像出現了幻覺

image-20250414080747798

單線程不能并發

image-20250414160641872


三范式

image-20250414080936943

第二范式

修改前(聯合主鍵,部分依賴)

image-20250414081242181

修改后,三張表,關系表兩個外鍵

image-20250414081227757

不能產生復合主鍵,部分依賴就是某個字段只依賴其中一個主鍵,和另一個主鍵沒關系

多對多關系,需要設計三張表A表,B表,關系表

多對多,三張表,關系表兩外鍵


第三范式

修改前(班級依賴01,01依賴1001)產生傳遞依賴

image-20250414081450268

修改后(多的表加外鍵)

image-20250414081522999

一對多,兩張表,多的表加外鍵


大部分情況下,公司都不會遵循設計三范式

為了滿足客戶需求,速度要快的情況下,哥們不需要節省空間,有的是空間,不怕數據冗余
可以寫在一張表內,就不會出現笛卡爾積現象

因為表與表連接次數越多,效率越慢


存儲引擎

以表為單位的,同一個數據庫不同表可以有多種不同的存儲引擎

mysql體系結構

image-20250414160916253

索引在引擎層


InnoDB存儲引擎

支持事務,行級鎖,外鍵

在這里插入圖片描述

表結構,數據,索引全部都在表空間文件.ibd中

8.0之后表結構從.frm----->.sdi

邏輯存儲結構

image-20250414161500104


MyISAM(MongoDB)

image-20250414161612644

Memory(Redis)

image-20250414161658027

只有一個.sdi表結構數據在硬盤中,數據和索引都在內存中


image-20250414161830120

image-20250414162036597


索引

是一種優化后的B+ Tree數據結構

SQL優化都是根據索引來優化

image-20250414162335081

索引在引擎層實現

image-20250414162738550

image-20250414162815315


B樹

二叉樹

缺點:1.順序插入形成單向鏈表

2.一個節點只能有兩個子節點,數據量大時,層級較深,檢索速度慢

image-20250414163030688

對于第一個問題,可以使用紅黑樹,自平衡,但是第二個問題不能解決

image-20250414163121743

B樹(多路平衡查找樹)(一個節點下可以有多個子節點,解決第二個問題),同樣也是自平衡的

度數:樹的度數指的是一個節點的子節點個數

image-20250414163429985

數據掛在key下面

B樹插入規則

以5階B樹為例,最多四個key

image-20250414163633579 插入1200

插入后中間的數向上分裂(這里是345)

image-20250414163744566


B+樹

image-20250414164309307

所有的元素都會出現在葉子節點中,上面的非葉子節點起到索引的作用,葉子節點是存放數據的

形成單向鏈表

B+樹插入規則

image-20250414164350794 插入890

同樣,567向上分裂,但是葉子節點也會有567,出現指針,形成單向鏈表

image-20250414164415634

image-20250414164516090

Mysql索引對B+樹做了優化

在這里插入圖片描述

葉子節點是雙向鏈表,每一個節點都是存儲在頁中的


Hash索引數據結構

查詢效率高(不發生哈希沖突的情況)

不支持范圍查詢和排序

在這里插入圖片描述

image-20250414190913523

為什么InnoDB存儲引擎使用B+樹索引結構

image-20250414191152900

對于B樹和B+樹來說,每個節點都是存儲在頁page中,而page的大小是固定為16k的,所以對于B樹來說,page中存儲數據的話,會搶占key和指針的空間

key和指針減少,層級就會增多,導致性能降低


索引分類

image-20250414191615443

單列索引,聯合索引都是常規索引

常規索引屬于二級索引

image-20250414191641603

聚簇索引,葉子節點保存了整行數據

非聚簇索引,葉子節點保存的是對應的主鍵id,如果有常規索引,也會保存常規索引字段數據

image-20250414191826300

image-20250414191943348

回表

image-20250414192027477

先查arm 索引找到主鍵id,然后根據主鍵id再找到對應的一整行數據


性能調優

主要對于索引來優化查詢語句

com后七個_

? image-20250414193158497

看當前數據庫是插入,更新,刪除,誰為主

如果發現查詢占主導,就需要進行sql優化


慢查詢日志

image-20250414193403261


以上都是根據sql語句的執行時間來判斷sql的性能,我們不能只看執行時間

explain 執行計劃

image-20250414194219497

在這里插入圖片描述

多表查詢

image-20250414195347392

id相同,表結構執行順序從上往下,先執行student,再執行連接表,最后執行course表

子查詢(select嵌套)

image-20250414195507317

id不同,值越大越先執行,先執行最內層的表,一層層執行出去

image-20250414195831614


select_type意義不大,只說明當前sql的查詢類型

image-20250414195845929


type

在這里插入圖片描述

對于正常業務來說,const就是最好的了,NULL是不查表,system是查詢系統表

where對主鍵和唯一索引查詢一般是const和eq_ref,對于非唯一性索引一般是ref

index雖然用了索引,但也是對索引進行全表掃描,all是全表掃描


possible_key

在這里插入圖片描述

顯示可能用到的索引


key

image-20250414200520171

實際用到的索引


image-20250414200550429

image-20250414200714215

image-20250414200652642

返回條數和實際掃描條數占比,越大越好


索引的使用

最左前綴法則(聯合索引)

image-20250414202126007

針對于聯合索引,查詢時從索引最左側列(必須存在)開始,不跳過索引中間的列,如果跳過某一列,這一列后面的索引將會失效

創建聯合索引

image-20250414201453568

profession,age,status,按順序聯合,profession是最左字段

image-20250414201719706

image-20250414201804934

表示status這個字段索引長度是5

在這里插入圖片描述

表示age索引長度是2

image-20250414201922127

全表掃描,索引失效,因為沒有最左字段

在這里插入圖片描述

缺少中間字段,所以之后的索引部分失效,只走了profession的索引

和字段使用順序無關,只要出現就行


范圍查詢(聯合索引)

針對于聯合索引

在這里插入圖片描述

image-20250414202351104


索引失效情況

1.對索引列進行運算操作(函數substr等)

image-20250414202656377

2.字符串字段沒有加’’

image-20250414203002035

3.頭部模糊匹配,索引失效

image-20250414203153366

4.or前后字段都要有索引才會走索引,不然失效

image-20250414203338526

在這里插入圖片描述

5.數據分布影響

有時候使用索引比全表掃描還慢,就不會使用索引

比如:當我們要一個條件把全表都查出來(或者表的絕大部分都是滿足條件的),肯定走全表掃描比走索引快

is null (因為絕大部分都不是null,不滿足)一般走索引

is not null(因為絕大部分都不是null,滿足)一般不走索引

所以null要看表中數據絕大部分滿不滿足,如果滿足,就不走,如果不滿足,就走索引


SQL提示

可以給一個字段添加多個索引,比如聯合索引和單列索引

mysql默認會執行聯合索引(前提滿足最左前綴法則)

可以指定來使用哪個索引
在這里插入圖片描述

在這里插入圖片描述

use index 只是一個建議,mysql可能不會用

force index 是必須用


覆蓋索引

select返回的字段在索引列中都能找到,而不需要回表查詢,這樣的索引就是覆蓋索引

盡量避免select *

image-20250414220344250

image-20250414220524614

測試

image-20250414220943814

對username和password加聯合索引,就不需要回表了


前綴索引

image-20250414221207765

image-20250414221856000

前綴索引中,回表查詢拿到row這一行的數據不會直接返回,而是會對比這條數據中前綴索引字段和select語句的字段是否一致,如果一致則返回結果,如果不一致,則順著二級索引的鏈表繼續查找下一個判斷


單列和聯合索引的選擇

image-20250414222146055

一個字段可以有多個索引,比如自己的單列索引再加上和別人的聯合索引

image-20250414222334732

mysql會評估哪個字段的索引效率更高,會選擇改索引,也就是phone索引

此時在phone的單列索引中不包含name字段,所以會進行回表查詢


我們給phone和name添加上聯合索引后,還是使用的phone的單列索引(單列索引干擾),還是會回表

在這里插入圖片描述

所以我們可以用sql提示(use index)來指定mysql使用聯合索引

所以,如果存在多個查詢條件,我們一般建立聯合索引(覆蓋索引,不會回表查詢)


聯合索引的數據結構

image-20250414223704692


索引設計原則

在這里插入圖片描述

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

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

相關文章

面試篇 - GPT-1(Generative Pre-Training 1)

GPT-1(Generative Pre-Training 1) ?模型結構 Transformer only-decoder:GPT-1模型使用了一個12層的Transformer解碼器。具體細節與標準的Transformer相同,但位置編碼是可訓練的。 注意力機制: 原始Transformer的解…

ubuntu24.04 cmake 報錯 libldap-2.5.so.0 解決辦法

apt cmake有毛病 換源重新安裝 wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" sudo apt update sudo apt in…

ScholarCopilot:“學術副駕駛“

這里寫目錄標題 引言:學術寫作的痛點與 AI 的曙光ScholarCopilot 的核心武器庫:智能生成與精準引用智能文本生成:不止于“下一句”智能引用管理:讓引用恰到好處 揭秘背后機制:檢索與生成的動態協同快速上手&#xff1a…

vivo X200 Ultra前瞻系列(2):vivo X200 Ultra影像技術溝通會總結

vivo于今日(2025年4月14日)舉辦的“X系列藍圖影像技術溝通會”中,正式發布了vivo X200 Ultra,展示了其在移動影像領域的多項技術突破。以下是本次溝通會的核心內容總結: 1. 硬件革新:蔡司三焦段鏡頭與雙芯架構 蔡司三大定焦大師鏡頭: X200 Ultra采用14mm超廣角(“鷹眼”…

代碼隨想錄第17天:二叉樹

一、二叉搜索樹的最近公共祖先(Leetcode 235) 由于是二叉搜索樹,節點的值有嚴格的順序關系:左子樹的節點值都小于父節點,右子樹的節點值都大于父節點。利用這一點,可以在樹中更高效地找到最低公共祖先。 c…

C++中string庫常用函數超詳細解析與深度實踐

目錄 一、引言 二、基礎準備:頭文件與命名空間 三、string對象的創建與初始化(基礎) 3.1 直接初始化 3.2 動態初始化(空字符串) 3.3 基于字符數組初始化 3.4 重復字符初始化 四、核心函數詳解 4.1 字符串長度相關 4.1.1 …

LanDiff:賦能視頻創作,語言與擴散模型的融合力量

自從 Wan 2.1 發布以來,AI 視頻生成領域似乎進入了一個發展瓶頸期,但這也讓人隱隱感到:“DeepSeek 時刻”即將到來!就在前幾天,浙江大學與月之暗面聯合推出了一款全新的文本到視頻(T2V)生成模型…

【本地圖床搭建】寶塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”圖床方案

寫在前面:本博客僅作記錄學習之用,部分圖片來自網絡,如需引用請注明出處,同時如有侵犯您的權益,請聯系刪除! 文章目錄 前言寶塔安裝DockerMinIO 安裝與設置cploar內網穿透PicGo下載與安裝typora安裝總結互動…

centos-LLM-生物信息-BioGPT-使用1

參考: GitHub - microsoft/BioGPT https://github.com/microsoft/BioGPT BioGPT:用于生物醫學文本生成和挖掘的生成式預訓練轉換器 |生物信息學簡報 |牛津學術 — BioGPT: generative pre-trained transformer for biomedical text generation and mini…

高效爬蟲:一文掌握 Crawlee 的詳細使用(web高效抓取和瀏覽器自動化庫)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、Crawlee概述1.1 Crawlee介紹1.2 為什么 Crawlee 是網頁抓取和爬取的首選?1.3 為什么使用 Crawlee 而不是 Scrapy1.4 Crawlee的安裝二、Crawlee的基本使用2.1 BeautifulSoupCrawler的使用方式2.2 ParselCrawler的使…

架構總覽怎么寫,才算工業級?

??系統架構文檔是整個項目最重要的起點,但很多人第一章就“寫穿了”: 不是寫得太細,就是沒有重點。想要寫出高質量、能協作、能傳承的架構文檔,這一篇會告訴你應該怎么做—— ? 架構總覽的終極目標 明確邊界、定義角色、畫清數據流 別講執行細節,別深入函數調用。 ? 架…

優先級隊列(堆二叉樹)底層的實現:

我們繼續來看我們的優先級隊列: 優先級隊列我們說過,他也是一個容器適配器,要依賴我們的容器來存儲數據; 他的第二個參數就是我們的容器,這個容器的默認的缺省值是vector,然后他的第三個參數,我…

GIC驅動程序分析

今天呢,我們就來具體的講一下GIC的驅動源碼啦,這個才是重點來著,我們來看看: GIC中的重要函數和結構體: 沿著中斷的處理流程,GIC涉及這4個重要部分: CPU從異常向量表中調用handle_arch_irq&am…

java操作redis庫,開箱即用

application.yml spring:application:name: demo#Redis相關配置redis:data:# 地址host: localhost# 端口,默認為6379port: 6379# 數據庫索引database: 0# 密碼password:# 連接超時時間timeout: 10slettuce:pool:# 連接池中的最小空閑連接min-idle: 0# 連接池中的最…

Cribl 通過Splunk search collector 來收集數據

今天利用Spliunk search collector 來收集數據啦:還是要先cribl 的官方文檔: Splunk Search Collector | Cribl Docs Splunk Search Collector Cribl Stream supports collecting search results from Splunk queries. The queries can be both simple and complex, as well a…

What Was the “Game Genie“ Cheat Device, and How Did It Work?

什么是“Game Genie”作弊裝置,它是如何工作的? First released in 1991, the Game Genie let players enter special codes that made video games easier or unlocked other functions. Nintendo didnt like it, but many gamers loved it. Heres wha…

位運算題目:連接連續二進制數字

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題:連接連續二進制數字 出處:1680. 連接連續二進制數字 難度 5 級 題目描述 要求 給定一個整數 n \texttt{n} n,將 1 \text…

第十六屆藍橋杯Java b組(試題C:電池分組)

問題描述: 輸入格式: 輸出格式: 樣例輸入: 2 3 1 2 3 4 1 2 3 4 樣例輸出: YES NO 說明/提示 評測用例規模與約定 對于 30% 的評測用例,1≤T≤10,2≤N≤100,1≤Ai?≤10^3。對于 100…

63. 評論日記

2025年4月14日18:53:30 雷軍這次是真的累了_嗶哩嗶哩_bilibili

電商中的訂單支付(內網穿透)

支付頁面 接口文檔 Operation(summary"獲取訂單信息") GetMapping("auth/{orderId}") public Reuslt<OrderInfo> getOrderInfo(Parameter(name"orderId",description"訂單id",requiredtrue) PathVaariable Long orderId){OrderI…