MySQL - 視圖,事務和索引

目錄

  • 一、視圖
    • 1. 問題
    • 2. 視圖是什么
    • 3. 定義視圖
    • 4. 查看視圖
    • 5. 使用視圖
    • 6. 刪除視圖
    • 7. 視圖的作用
  • 二、事務
    • 1. 定義
    • 2. 事務命令
      • 1)回滾
      • 2)提交
      • 3)臟寫、臟讀、不可重復讀和幻讀
  • 三、索引
    • 1. 定義
    • 2. 索引是什么
    • 3. 索引目的
    • 4. 索引原理
    • 5. 索引的使用
    • 6. 注意


一、視圖

1. 問題

對于復雜的查詢,往往是有多個數據表進行關聯查詢而得到,如果數據庫因為需求等原因發生了改變,為了保證查詢出來的數據與之前相同,則需要在多個地方進行修改,維護起來非常麻煩。

解決辦法:定義視圖。

2. 視圖是什么

通俗的講,視圖就是一條 SELECT 語句執行后返回的結果集。所以我們在創建視圖的時候,主要的工作就落在創建這條 SQL 查詢語句上。

視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變)。

方便操作,特別是查詢操作,減少復雜的 SQL 語句,增強可讀性。

3. 定義視圖

create view 視圖名稱 as select 語句;

例如:create view goods_view as (select goods.id as id,goods.name as name,goods_cates.name as type from goods left outer join goods_cates on goods_cates.id=goods.cate_id);

4. 查看視圖

查看表會將所有的視圖也列出來 show tables;

5. 使用視圖

視圖的用途就是查詢 select * from v_stu_score;

6. 刪除視圖

drop view 視圖名稱;

例:drop view v_stu_sco;

7. 視圖的作用

  • 提高了重用性,就像一個函數

  • 對數據庫重構(改了字段名),卻不影響程序的運行

  • 提高了安全性能,可以對不同的用戶

  • 讓數據更加清晰

二、事務

1. 定義

事務廣泛的運用于訂單系統、銀行系統等多種場景。所謂事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。

例如,銀行轉帳工作:從一個帳號扣款并使另一個帳號增款,這兩個操作要么都執行,要么都不執行。所以,應該把他們看成一個事務。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。

事務四大特性(簡稱 ACID)

  • 原子性(Atomicity):一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要么全部提交成功,要么全部失敗回滾,對于一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性

  • 一致性(Consistency):數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。

  • 隔離性(Isolation)→ 針對高并發重要:通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。

  • 持久性(Durability)→ 磁盤上真實的發生了變化:一旦事務提交,則其所做的修改會永久保存到數據庫。(此時即使系統崩潰,修改的數據也不會丟失。)

可以用 START TRANSACTION 語句開始一個事務,然后要么使用 COMMIT 提交將修改的數據持久保存,要么使用 ROLLBACK 撤銷所有的修改。事務 SQL 的樣本如下:

  • 事務開啟:start transaction;

  • select balance from checking where customer_id = 10233276;

  • update checking set balance = balance - 200.00 where customer_id = 10233276;

  • update savings set balance = balance + 200.00 where customer_id = 10233276;

  • commit;

2. 事務命令

表的引擎類型必須是 innodb 類型才可以使用事務,這是 mysql 表的默認引擎。

  • 查看表的創建語句,可以看到 engine=innodb
-- 選擇數據庫
use jing_dong;
-- 查看goods表
show create table goods;
  • 開啟事務,命令如下:begin; 或者 start transaction; 。開啟事務后執行修改命令,變更會維護到本地緩存中,而不維護到物理表中。

  • 提交事務,命令如下:commit; 。將緩存中的數據變更維護到物理表中。

  • 回滾事務,命令如下:rollback; 。放棄緩存中變更的數據。

注意:

  • 修改數據的命令會自動的觸發事務,包括 insert、update、delete

  • 而在 SQL 語句中有手動開啟事務的原因是:可以進行多次數據的修改,如果成功一起成功,否則一起會滾到之前的數據

1)回滾

  • 連接:終端 1 select * from goods_cates;

  • 增加數據:

終端 2:開啟事務,插入數據

begin;
insert into goods_cates(name) values('游戲機');

終端 2:查詢數據,此時有新增的數據 select * from goods_cates;

  • 查詢:終端 1 查詢數據,發現并沒有新增的數據 select * from goods_cates;

  • 回滾:終端 2 完成回滾 rollback;

  • 查詢:終端 1 查詢數據,發現沒有新增的數據 select * from goods_cates;

2)提交

  • 連接:終端 1 查詢商品分類信息 select * from goods_cates;

  • 增加數據

終端 2 開啟事務,插入數據

begin;
insert into goods_cates(name) values('游戲機');

終端 2 查詢數據,此時有新增的數據 select * from goods_cates;

  • 查詢:終端 1 查詢數據,發現并沒有新增的數據 select * from goods_cates;

  • 提交:終端 2 完成提交 commit;

  • 查詢:終端 1 查詢,發現有新增的數據 select * from goods_cates;

3)臟寫、臟讀、不可重復讀和幻讀

臟寫、臟讀、不可重復讀和幻讀是數據庫事務中常見的數據一致性問題,了解它們有助于更好地管理并發事務。

參考文章:【大白話講解臟寫、臟讀、不可重復讀和幻讀】

  • 臟寫就是:兩個事務沒提交的狀況下,都修改同一條數據,結果一個事務回滾了,把另外一個事務修改的值也撤銷了,所謂臟寫就是兩個事務沒提交狀態下修改同一個值。

  • 臟讀就是一個事務修改了一條數據的值,結果還沒提交呢,另外一個事務就讀到了你修改的值,然后你回滾了,人家事務再次讀,就讀不到了,即人家事務讀到了你修改之后還沒提交的值,這就是臟讀。

  • 不可重復讀,針對的是已經提交的事務修改的值,被你事務給讀到了,你事務內多次查詢,多次讀到的是別的已經提交的事務修改過的值,這就導致不可重復讀。

  • 幻讀就是:你一個事務用一樣的 SQL 多次查詢,結果每次查詢都會發現查到一些之前沒看到過的數據。注意,幻讀特指的是你查詢到了之前查詢沒看到過的數據。

臟寫臟讀不可重復讀幻讀
read uncommitted×
read committed××
repeatable read×××
serializable××××

三、索引

1. 定義

當數據庫中數據量很大時,查找數據會變得很慢。優化方案:索引 → 就是數據結構(有序),B+ 樹索引,哈希索引。

2. 索引是什么

索引是一種特殊的文件(InnoDB 數據表上的索引是表空間的一個組成部分),它們包含著對數據表里所有記錄的引用指針。更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。

3. 索引目的

索引的目的在于提高查詢效率,可以類比字典,如果要查 “mysql” 這個單詞,我們肯定需要定位到 m 字母,然后從下往下找到 y 字母,再找到剩下的 sql 。如果沒有索引,那么你可能需要把所有單詞看一遍才能找到你想要的。

4. 索引原理

除了詞典,生活中隨處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得數據的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查找方式來鎖定數據。

數據庫也是一樣,但顯然要復雜許多,因為不僅面臨著等值查詢,還有范圍查詢(>、<、between、in)、模糊查詢(like)、并集查詢(or)等等。

  • 紅黑樹:不同節點的存在磁盤的不同位置,訪問 7 個節點就需要 2 次磁盤 I/O

  • 哈希索引:因為需要連續的磁盤空間來存哈希表,找到連續的較大磁盤空間的難度較大(磁盤碎片嚴重)

  • B+ 索引

5. 索引的使用

  • 查看索引:show index from 表名;

  • 創建索引:

    • 如果指定字段是字符串,需要指定長度,建議長度與定義字段時的長度一致
    • 字段類型如果不是字符串,可以不填寫長度部分
create index 索引名稱 on 表名(字段名稱(長度))
create unique index 索引名稱 on 表名(字段名稱(長度))
  • 刪除索引: drop index 索引名稱 on 表名;

注意:

  • 當一列是沒有區分度,不適合建索引;

  • 主鍵索引不僅僅是 B+ 樹索引,還是聚集索引(索引值和行數據存在一起,行數據直接就在葉子結點上);

  • 一個表中只能有一個聚集索引(主鍵默認就是聚集索引),其他索引都是非聚集索引。

6. 注意

  • 要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對于一個經常需要更新和插入的表格,就沒有必要為一個很少使用的 where 字句單獨建立索引了,對于比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。

  • 建立索引會占用磁盤空間。

  • 索引提高了查詢效率,修改效率,刪除效率;降低了一點新增效率。

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

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

相關文章

車載鐵框矯平機:把“鈑金診所”開到工地上

——一次從原子層面開始的平整之旅一、先想一想&#xff1a;鐵框為什么“脾氣大” 鋼板在軋制、切割、焊接、吊裝、甚至太陽暴曬時&#xff0c;內部晶粒被拉得七扭八歪&#xff0c;像揉皺的紙。宏觀上&#xff0c;我們就看到“翹、拱、扭”。矯平&#xff0c;實質上是給金屬做一…

不安全的服務器,不支持 FTP over TLS

當服務器不支持 FTP over TLS&#xff08;也稱為 FTPS&#xff09;時&#xff0c;意味著它僅支持未加密的 FTP 連接。這種情況存在顯著的安全風險&#xff0c;因為&#xff1a;數據傳輸不加密&#xff1a;用戶名、密碼以及傳輸的文件內容都會以明文形式在網絡中傳輸&#xff0c…

本地緩存與 Redis 緩存的區別與實際應用

緩存是提升系統性能、降低數據庫壓力的重要手段。Java 開發中常用的緩存方案包括 ?本地緩存&#xff08;如 Caffeine、Guava Cache&#xff09;?? 和 ?分布式緩存&#xff08;如 Redis&#xff09;?。這兩者在設計目標、使用場景、性能特點等方面有顯著差異&#xff0c;合…

從“0”開始學JAVA——第十一節 I/O流

在Java編程中&#xff0c;文件操作和輸入輸出(IO)處理是必不可少的部分。本文將深入探討Java IO包中的文件流操作&#xff0c;包括基礎概念、分類、常用類以及實際應用場景。1. File類File類是Java IO操作的基礎&#xff0c;它實現了Serializable和Comparable<File>接口。…

【數據價值化】數據資產入表指南:核心準則與實操路徑

隨著數據要素市場的蓬勃發展&#xff0c;數據資產的商業價值愈發凸顯。然而&#xff0c;如何讓數據資產合規、合理地進入企業財務報表&#xff0c;成為眾多企業急需解決的難題。本文基于《企業會計準則》的相關規定&#xff0c;為您系統梳理數據資產入表的核心準則要點與實操路…

基于 MediaPipe + Three.js 的實時姿態可視化前端

這是一套前端實時姿態捕獲與 3D 可視化的 DEMO&#xff0c;特點是啟動快、UI 現代、渲染穩定&#xff0c;同時對設備性能與網絡情況做了多處優化。 預覽地址 技術棧與核心依賴 框架與工程&#xff1a;Vite React TypeScript實時姿態識別&#xff1a;MediaPipe Tasks Vision&…

【分布式技術】Kafka 數據積壓全面解析:原因、診斷與解決方案

Kafka 數據積壓全面解析&#xff1a;原因、診斷與解決方案Kafka 數據積壓深度解析與解決方案全景指南一、數據積壓核心原因矩陣二、生產者側問題深度解析1. 突發流量洪峰2. 大消息阻塞管道三、消費者側問題深度解析1. 消費能力不足2. 消費邏輯阻塞四、Broker集群問題深度解析1.…

企業云辦公安全指南:如何構建高效無憂的云辦公環境?

2025年&#xff0c;全球化協作與混合辦公已成為企業運營的常態。越來越多的企業將業務遷移至云端&#xff0c;云辦公在提升靈活性與效率的同時&#xff0c;也帶來了新的安全挑戰——數據泄露、內部威脅、網絡攻擊等風險無處不在&#xff0c;每一個環節都可能成為企業核心資產的…

Thingsboard 租戶管理員權限,增加租戶普通用戶權限

在 ThingsBoard CE&#xff08;社區版&#xff09;中&#xff0c;租戶管理員擁有對規則鏈、客戶、資產、設備、儀表板等資源的全面管理權限。如果你想為租戶創建一個普通用戶&#xff0c;并限制其不能操作規則鏈、高級功能、安全設置等&#xff0c;可以通過以下步驟實現&#x…

【筆記】大模型業務場景流程綜述

前言 大模型是指具有大規模參數和復雜計算結構的深度學習模型,這些模型通常由眾多神經網絡構建而成,擁有數十億甚至數千億個參數。本章將圍繞大模型概念及特點展開,介紹模型算法的分類、典型大模型及應用、大模型訓練流程和大模型業務流程。 目標 學完本課程后,您將能夠…

【兩數相互求余等于輸入兩數】2022-10-20

緣由關于#c#的問題&#xff1a;這個應該按照怎么個思路來寫&#xff1a;想老半天莫得思路想法-編程語言-CSDN問答 void 兩數相互求余等于輸入兩數() {//緣由https://ask.csdn.net/questions/7813625int a 0, b 0, x 0, y 0;cin >> a >> b;if (a > b)x a, y…

Linux系統調優

目錄 1.CPU 負載查看 1.1.使用 uptime 查看系統負載 1.2.使用 top 按 CPU 使用率排序 1.3.使用 ps 查看 CPU 使用最多的進程 1.4.使用 mpstat 查看 CPU 詳細狀態 1.5.查看 /proc/meminfo 獲取詳細內存信息 2查看內存運行狀態 2.1.使用 free 查看內存使用 1.CPU 負載查看…

AtCoder Beginner Contest 420

比賽鏈接如下&#xff1a; AtCoder Beginner Contest 420 - AtCoder A - What month is it? Problem Statement You are given integers X and Y between 1 and 12, inclusive. Find what month it will be Y months after month X (for example, month 1 is January). Cons…

Python算法-貪心算法(Greedy Algorithm)

Python算法&#xff1a;貪心算法&#xff08;Greedy Algorithm&#xff09;深度解析 引言 貪心算法&#xff08;Greedy Algorithm&#xff09;是計算機科學中最基礎的算法設計思想之一&#xff0c;其核心在于通過局部最優選擇逐步構建全局最優解。盡管它并不總能保證得到絕對最…

告別臃腫與廣告:精選9款安卓電視桌面Launcher,還你清爽高效體驗 (2025版)

[實測] 9款優秀安卓電視桌面Launcher推薦&#xff1a;告別原生臃腫&#xff0c;重塑清爽TV體驗 引言&#xff1a;當前智能電視桌面的痛點 目前市面上許多智能電視或電視盒子的原生桌面&#xff08;Launcher&#xff09;系統&#xff0c;為了商業推廣和內容聚合&#xff0c;往…

Docker Desktop緊急修復CVSS9.3高危容器逃逸漏洞

Docker公司修復了Windows和macOS版Docker Desktop應用程序中的一個高危漏洞&#xff08;CVE-2025-9074&#xff0c;CVSS評分9.3&#xff09;&#xff0c;攻擊者可能利用該漏洞突破容器隔離限制。漏洞技術細節根據Docker官方文檔披露&#xff0c;惡意容器能夠訪問Docker引擎并在…

攜程旅游的 AI 網關落地實踐

原創 董藝荃 Higress 2025年08月21日 16:32 陜西本文整理自攜程旅游研發總監董藝荃在2025中國可信云大會上的分享&#xff0c;董藝荃 GitHub ID CH3CHO&#xff0c;同時也是 Higress 的 Maintainer。分享內容分為以下4部分。01 大規模應用 AI 技術過程中遇到了哪些問題02 網關…

CloudBase云開發MCP + CodeBuddy IDE:打造智能化全棧理財助手的完整實踐

CloudBase云開發MCP CodeBuddy IDE&#xff1a;打造智能化全棧理財助手的完整實踐 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#x…

ESP8266學習

一&#xff0c;連接Wifi1.Esp8266連接手機熱點ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"手機查看連接信息2.Esp8266連接手機熱點進入透傳模式ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"ATCIPMUX0 ATCIPSTART"TCP&qu…

Mac安裝mitmproxy及操作對監控的請求

在 macOS 上安裝和配置 mitmproxy 是一個相對簡單的過程&#xff0c;可以使用常見的包管理工具如 Homebrew 或直接通過 Python 的包管理工具 pip。以下是詳細的安裝步驟&#xff1a; 方法一&#xff1a;使用 Homebrew 安裝 Homebrew 是 macOS 上流行的包管理工具。它可以快速安…