MySQL高級
這裏高級應用的SQL語句,不需要背。當實際需要時,查詢本教程或谷歌即可。
一、視圖
1)視圖是什麼
- 數據庫表結構改變時,程序也要相應改動,這樣的話,耦合度太高了。
- 當我們寫完一個程序時,它要在操作系統上使用。那是不是,Windows上要一個版本?然後Linux上要一個版本?理論上是的。但是有這樣一個東西,它叫解釋器,有Windows解釋器也有Linux解釋器。只要有這些解釋器,在不同操作系統上,程序不用改動,就可以達到相同的功能。解釋器去除了底層的區別。
- 我們弄一個虛擬的表,從而無視底層的數據表變化。這個虛擬的表就叫視圖。
2)視圖的作用
- 視圖的作用就是隔離數據庫:視圖就是一條select語句執行後返回的結果集。是對若干張基本表的引用,是一張虛表,是查詢語句執行的結果。
- 視圖是爲了方便查詢的,不是爲了增刪改的。
- 虛擬表在調用時,才產生(相當於執行SQL語句)。所以它具有跟隨基礎表同步更新的特性。
3)代碼
- 你需要一個select語句查詢出來的結果集,比如:
- 創建視圖
create view 視圖名 as 結果集;
視圖名以v_開頭美觀。
(創建視圖代碼)
(查看錶,發現有個虛擬表)
(直接查看虛擬表)
4)刪除視圖
drop view 視圖名;
5)視圖的好處
- 提高了重用性,就像一個函數
- 對數據庫重構,卻不影響程序的運行
- 提高了安全性能,可以對不同的用戶
- 讓數據更加清晰
二、事務
1)事務是什麼
- 比如轉賬,不可以一個人扣了錢,另一個人沒收到。這種要麼同時執行,要麼同時不執行,形成一個不可分割的工作單位。這,就是事務。
- 事務是保證將來數據百分之百成功的一種方式。
- 使用start transaction;開啓一個事務。使用commit;提交一個事務。使用rollback;回滾一個事務。
2)事務的四大特性ACID(背誦理解)
1>四大特性
- 原子性A
- 一致性C
- 隔離性I
- 持久性D
比如買東西時。需要幾個步驟:①檢查賬戶餘額是否充足 ②從本人賬戶扣款 ③從商家賬戶增款
上面三個操作必須打包在一個事務中,任何一個步驟失敗,則必須回滾rollback;所有的步驟。
1>四大特性詳解
原子性是指: 一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能值執行其中的一部分操作,這就是事務的原子性
#(所有語句都成功,就commit。否則就rollback)
一致性是指: 數據庫總是從一個一致性的狀態,轉向另一個一致性的狀態。(比如某條失敗,事務中所做的修改也不會保存在數據庫中)(要麼執行成功,要麼不執行成功)
隔離性是指: 一個事務在最終提交之前,對其它事務是隔離的,不可見。(如下面,一個終端發生了事務,另一個終端也想對此行進行修改。哪個先commit,哪個就先修改。當然,後修改的會覆蓋。)
持久性是指: 一旦事務提交,其所做的修改會永久保存到數據庫。(即使系統崩潰,修改的數據也不會丟失。)
**總結一下:**原子性是要麼成功,要麼不成功。一致性是不會出現中間數據丟了的情況。隔離性是一個用戶的操作,對其他用戶不可見。
3>舉例說明
- python是默認開啓事務的,所以需要commit提交。終端也是默認開啓事務的,但它也默認提交。希望終端開啓事務而不自動提交,就需要手動開啓事務。用start transaction;或者begin;來開啓一個事務,這樣,只要用戶不commit,它就不會提交。(在這個終端即使不提交,也可以預覽到。但實際是沒發生的。可以在沒提交狀態下,使用另一個終端查看。)
這樣看來,開啓事務似乎沒什麼影響啊。我們保持這個終端不動,開啓另一個終端。會發現,沒有最後那一條數據。原因就是沒有提交commit。
接下來,和我做一樣的操作:在原終端,不提交事務,而在新終端對原終端修改的這幾條記錄,進行修改,會發生什麼?
最後一行的意思是,有鎖,終端等待太久,請嘗試重新啓動事務。
只要舊終端一提交或是回滾,新終端緊接着就會開始執行。最後顯示的內容,是新終端的內容。
三、索引
- 索引是一種特殊的文件(innoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。
- 相當於一個文章的空間,留出一小部分來放置目錄。
1)程序執行的時間
- 要知道索引有多快,首先要知道怎樣記錄時間。
- 拿出你的
秒錶終端:
--開啓運行時間監測
set profiling=1;
--運行幾條SQL語句
--查看執行的時間(會顯示ID,時間,以及對應的SQL語句)
show profiles;
單看,並不覺得快或是慢,下面建立索引,對比看看。
2)建立索引
create index 表名 on 表名(字段名);
例如: create index test on test(tital(15));
--解釋一下,這裏title是字符串類型的,且長度爲15.整數類型就不用寫括號。
依次執行下列語句:
- select * from test where title=“重要的事情說77777遍!”;
- create index test on test(title(15));
- select * from test where title=“重要的事情說77777遍!”;
紅框爲沒有索引時的時間,藍框爲建立索引後的時間。十萬條數據下,快了兩個數量級。數據更多時,差距更大。
- 索引的字段就相當於字典裏的筆畫拼音等,是一個依據,只有根據它查找時,纔會更快。如果有多個字段,根據其它字段查找,並不會變快。
- 索引通過不斷地縮小想要獲得數據的範圍來篩選出最終想要的結果。相當於一個樹。下面是一個B+樹。
3)查看索引
- keyname表示索引的表,colum_name表示索引的字段。
- 上圖是什麼? 我們查詢了一個沒有添加過索引的表的索引。發現有三個索引。原來是生成主鍵和外鍵時,自動生成了索引。
4)刪除索引
drop index 索引名 on 表名;
5)注意
- 建立太多的索引將會影響更新和插入的書讀。因爲它同樣需要更新每個索引文件。如果更新修改的頻率大,查詢頻率小,就沒有必要建立索引了。比較小的表,也沒有必要建立索引。
- 索引要佔用磁盤空間。
四、賬戶管理(需要時查文檔即可)
1)授予權限
1>理解用戶概念
--使用mysql數據庫。(數據庫信息存在這個數據庫裏。)
- use mysql;
- show tables;
-- 可以看到有許多張表。user表裏存着root用戶信息。接下來查看user的字段。- desc user;
--可以看到有許多的字段。- select user,host from user;
左邊一列,表示可以登錄mysql的用戶。右邊表示可以通過哪個地方登錄, % 表示任意一臺電腦登錄,localhost表示只能本地登錄。
--查看密碼(加密過的密碼)- 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‘,密碼暴力破解。數據庫的大門自向別人打開。