MySQL高級 #視圖 #事務 #索引 #賬戶管理


這裏高級應用的SQL語句,不需要背。當實際需要時,查詢本教程或谷歌即可。

一、視圖

1)視圖是什麼

  • 數據庫表結構改變時,程序也要相應改動,這樣的話,耦合度太高了。
  • 當我們寫完一個程序時,它要在操作系統上使用。那是不是,Windows上要一個版本?然後Linux上要一個版本?理論上是的。但是有這樣一個東西,它叫解釋器,有Windows解釋器也有Linux解釋器。只要有這些解釋器,在不同操作系統上,程序不用改動,就可以達到相同的功能。解釋器去除了底層的區別。
  • 我們弄一個虛擬的表,從而無視底層的數據表變化。這個虛擬的表就叫視圖。
    在這裏插入圖片描述

2)視圖的作用

  • 視圖的作用就是隔離數據庫:視圖就是一條select語句執行後返回的結果集。是對若干張基本表的引用,是一張虛表,是查詢語句執行的結果。
  • 視圖是爲了方便查詢的,不是爲了增刪改的。
  • 虛擬表在調用時,才產生(相當於執行SQL語句)。所以它具有跟隨基礎表同步更新的特性。

3)代碼

  1. 你需要一個select語句查詢出來的結果集,比如:
    在這裏插入圖片描述
  2. 創建視圖

create view 視圖名 as 結果集;

視圖名以v_開頭美觀。
(創建視圖代碼)
在這裏插入圖片描述
(查看錶,發現有個虛擬表)
在這裏插入圖片描述
(直接查看虛擬表)
在這裏插入圖片描述

4)刪除視圖

drop view 視圖名;

5)視圖的好處

  1. 提高了重用性,就像一個函數
  2. 對數據庫重構,卻不影響程序的運行
  3. 提高了安全性能,可以對不同的用戶
  4. 讓數據更加清晰

二、事務

1)事務是什麼

  • 比如轉賬,不可以一個人扣了錢,另一個人沒收到。這種要麼同時執行,要麼同時不執行,形成一個不可分割的工作單位。這,就是事務。
  • 事務是保證將來數據百分之百成功的一種方式。
  • 使用start transaction;開啓一個事務。使用commit;提交一個事務。使用rollback;回滾一個事務。

2)事務的四大特性ACID(背誦理解)

1>四大特性

  1. 原子性A
  2. 一致性C
  3. 隔離性I
  4. 持久性D

比如買東西時。需要幾個步驟:①檢查賬戶餘額是否充足 ②從本人賬戶扣款 ③從商家賬戶增款
上面三個操作必須打包在一個事務中,任何一個步驟失敗,則必須回滾rollback;所有的步驟。

1>四大特性詳解

原子性是指: 一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能值執行其中的一部分操作,這就是事務的原子性
#(所有語句都成功,就commit。否則就rollback)

一致性是指: 數據庫總是從一個一致性的狀態,轉向另一個一致性的狀態。(比如某條失敗,事務中所做的修改也不會保存在數據庫中)(要麼執行成功,要麼不執行成功)

隔離性是指: 一個事務在最終提交之前,對其它事務是隔離的,不可見。(如下面,一個終端發生了事務,另一個終端也想對此行進行修改。哪個先commit,哪個就先修改。當然,後修改的會覆蓋。)

持久性是指: 一旦事務提交,其所做的修改會永久保存到數據庫。(即使系統崩潰,修改的數據也不會丟失。)

**總結一下:**原子性是要麼成功,要麼不成功。一致性是不會出現中間數據丟了的情況。隔離性是一個用戶的操作,對其他用戶不可見。

3>舉例說明

  • python是默認開啓事務的,所以需要commit提交。終端也是默認開啓事務的,但它也默認提交。希望終端開啓事務而不自動提交,就需要手動開啓事務。用start transaction;或者begin;來開啓一個事務,這樣,只要用戶不commit,它就不會提交。(在這個終端即使不提交,也可以預覽到。但實際是沒發生的。可以在沒提交狀態下,使用另一個終端查看。)

1-1

這樣看來,開啓事務似乎沒什麼影響啊。我們保持這個終端不動,開啓另一個終端。會發現,沒有最後那一條數據。原因就是沒有提交commit。
在這裏插入圖片描述
接下來,和我做一樣的操作:在原終端,不提交事務,而在新終端對原終端修改的這幾條記錄,進行修改,會發生什麼?
在這裏插入圖片描述

在這裏插入圖片描述

最後一行的意思是,有鎖,終端等待太久,請嘗試重新啓動事務。
只要舊終端一提交或是回滾,新終端緊接着就會開始執行。最後顯示的內容,是新終端的內容。

三、索引

  • 索引是一種特殊的文件(innoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。
  • 相當於一個文章的空間,留出一小部分來放置目錄。

1)程序執行的時間

  • 要知道索引有多快,首先要知道怎樣記錄時間。
  • 拿出你的秒錶終端:

--開啓運行時間監測
set profiling=1;
--運行幾條SQL語句
--查看執行的時間(會顯示ID,時間,以及對應的SQL語句)
show profiles;
在這裏插入圖片描述
單看,並不覺得快或是慢,下面建立索引,對比看看。

2)建立索引

create index 表名 on 表名(字段名);
例如: create index test on test(tital(15));
--解釋一下,這裏title是字符串類型的,且長度爲15.整數類型就不用寫括號。
依次執行下列語句:

  1. select * from test where title=“重要的事情說77777遍!”;
  2. create index test on test(title(15));
  3. select * from test where title=“重要的事情說77777遍!”;
    在這裏插入圖片描述
    紅框爲沒有索引時的時間,藍框爲建立索引後的時間。十萬條數據下,快了兩個數量級。數據更多時,差距更大。
  • 索引的字段就相當於字典裏的筆畫拼音等,是一個依據,只有根據它查找時,纔會更快。如果有多個字段,根據其它字段查找,並不會變快。
  • 索引通過不斷地縮小想要獲得數據的範圍來篩選出最終想要的結果。相當於一個樹。下面是一個B+樹。

在這裏插入圖片描述

3)查看索引

在這裏插入圖片描述

  • keyname表示索引的表,colum_name表示索引的字段。
    在這裏插入圖片描述
  • 上圖是什麼? 我們查詢了一個沒有添加過索引的表的索引。發現有三個索引。原來是生成主鍵和外鍵時,自動生成了索引。

4)刪除索引

drop index 索引名 on 表名;

5)注意

  • 建立太多的索引將會影響更新和插入的書讀。因爲它同樣需要更新每個索引文件。如果更新修改的頻率大,查詢頻率小,就沒有必要建立索引了。比較小的表,也沒有必要建立索引。
  • 索引要佔用磁盤空間。

四、賬戶管理(需要時查文檔即可)

1)授予權限

1>理解用戶概念

--使用mysql數據庫。(數據庫信息存在這個數據庫裏。)

  1. use mysql;
  2. show tables;
    在這裏插入圖片描述
    -- 可以看到有許多張表。user表裏存着root用戶信息。接下來查看user的字段。
  3. desc user;
    在這裏插入圖片描述
    --可以看到有許多的字段。
  4. select user,host from user;
    在這裏插入圖片描述
    左邊一列,表示可以登錄mysql的用戶。右邊表示可以通過哪個地方登錄, % 表示任意一臺電腦登錄,localhost表示只能本地登錄。
    --查看密碼(加密過的密碼)
  5. select host,user,authentication_string from user;
    在這裏插入圖片描述

2>創建用戶demo

創建用戶: create user ‘用戶名’@‘訪問主機’ identified by ‘密碼’;
給與權限: grant 權限列表 on 數據庫 to ‘用戶名’@‘訪問主機’;
在這裏插入圖片描述
--創建的前提是以root管理員登錄
create user ‘tom’@‘localhost’ identified by ‘123456’;
grant select on shop.* to ‘tom’@‘localhost’;
在這裏插入圖片描述

3>刪除賬號

drop user ‘名’@‘密’;

3>更多操作

官方對創建用戶的簽名
官方對Grant的說明
不要用遠程登錄。只要註釋了IP,就給了別人可乘之機。IP和端口可以用掃描儀,賬戶一般都有一個‘root‘,密碼暴力破解。數據庫的大門自向別人打開。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章