資料庫檢視,索引,觸發器
檢視
mySQL中的檢視是⼀種虛擬表 ,它是基於 ⼀個或多個基礎表(或其他檢視)的select查詢結果集 。虛擬表是⼀種邏輯
上的表,它不實際儲存資料,⽽是在查詢時動態⽣成結果集。因此,檢視並不是真正的表,⽽是基於⼀個或多個表
的查詢結果的⼀種“虛擬表”。
檢視可以看作是對基礎表的⼀個邏輯上的封裝,它可以隱藏基礎表的複雜性,簡化查詢操作,並提供資料安全性和
資料保護。檢視可以像表⼀樣進⾏查詢、更新、插⼊和刪除操作,但實際上它們不儲存任何資料,⽽是在查詢時動態⽣成結果集
檢視的應⽤場景包括
\
1. 簡化查詢操作:檢視可以將複雜的查詢操作封裝起來,使得⽤戶可以透過⼀個簡單的檢視來訪問需要的資料。
2. 資料安全性和資料保護:透過檢視可以限制⽤戶對某些資料的訪問許可權,保護資料的安全性。
3. 資料庫設計:檢視可以⽤於資料庫設計中,透過將多個表的資料合併到⼀個檢視中,簡化資料庫的設計和維護。
4. 效能最佳化:檢視可以提⾼查詢效能,透過將多個表的查詢結果快取到檢視中,可以避免重複查詢。
檢視是⼀個⾮常有⽤的⼯具,可以幫助我們簡化查詢操作,提⾼資料安全性和資料保護,最佳化資料庫設計和查詢效能。
檢視檢視
SHOW FULL TABLES WHERE TABLE_TYPE='VIEW';
檢視檢視詳細資訊
SHOW TABLE STATUS WHERE Name='檢視名';
檢視檢視建立定義資訊
SHOW CREATE VIEW 檢視名\G
SHOW CREATE VIEW total_product;
修改檢視
索引概述
索引就好⽐⼀本書的⽬錄,它會讓你更快的找到內容,顯然⽬錄(索引)並不是越多越好,假如這本書1000⻚,有
500⻚也是⽬錄,它當然效率低,⽬錄是要佔紙張的,⽽索引是要佔磁碟空間的。
分類
普通索引 INDEX: 最基本的索引,沒有任何限制
唯⼀索引 UNIQUE: 與"普通索引"類似,不同的是索引列的值必須唯⼀,但允許有空值。
全⽂索引 FULLTEXT:僅可⽤於 MyISAM 表,針對較⼤的資料,⽣成全⽂索引很耗時好空間。
主鍵索引 PRIMARY KEY:它是⼀種特殊的唯⼀索引,不允許有空值。
索引測試
未建立索引
id : 查詢中每個 SELECT ⼦句的唯⼀識別符號。
select_type : 查詢的型別。在這個例⼦中,查詢型別為 SIMPLE ,表示這是⼀個簡單的 SELECT 查詢,不
包含⼦查詢或聯接。
table : 正在訪問的表。
partitions : 匹配的分割槽。在這個例⼦中,分割槽為 NULL ,表示沒有使⽤分割槽。
type : 訪問表的⽅式。在這個例⼦中, type 為 ALL ,這意味著 MySQL 將掃描整個表來查詢匹配的⾏。
possible_keys : 可能使⽤的索引列表。在這個例⼦中,沒有使⽤索引,因此 possible_keys 為 NULL 。
key : 實際使⽤的索引。在這個例⼦中,沒有使⽤索引,因此 key 為 NULL 。
key_len : 使⽤的索引的⻓度。在這個例⼦中,沒有使⽤索引,因此 key_len 為 NULL 。
ref : 列與索引之間的匹配條件。在這個例⼦中,沒有使⽤索引,因此 ref 為 NULL 。
rows : MySQL 估計必須掃描的⾏數。在這個例⼦中,MySQL 估計必須掃描 199949 ⾏才能找到匹配的⾏。
filtered : MySQL 掃描表後過濾⾏的百分⽐。在這個例⼦中,MySQL 掃描了整個表,但只返回了 10% 的
⾏,因此 filtered 為 10.00 。
Extra : 其他資訊。在這個例⼦中,使⽤了 WHERE ⼦句來過濾⾏,因此 Extra 為 Using where 。
建立索引後
table : 查詢的表名,這⾥是 t5 。
partitions : 如果查詢使⽤了分割槽表,這⾥會列出使⽤的分割槽。
type : 訪問表的⽅式,這⾥是 ref ,表示使⽤了索引查詢。
possible_keys : 可能使⽤的索引,這⾥是 index_t5_id 。
key : 實際使⽤的索引,這⾥也是 index_t5_id 。
key_len : 使⽤的索引的⻓度,這⾥是 5 ,表示使⽤了⼀個 5 位元組的索引。
rows : 表示查詢掃描的⾏數,這⾥是 1 ,表示只掃描了⼀⾏。
這個查詢使⽤了 index_t5_id 索引,只掃描了⼀⾏,效能⽐較好
索引管理
刪除索引
//刪除索引語法: DROP INDEX 索引名 ON 表名
mysql> drop index index_t5_id on t5;
觸發器
當滿⾜⼀定的條件以後,它會觸發⼀個動作的執⾏,trigger
觸發器是⼀種特殊型別的儲存過程,它是在特定的表上⾃動執⾏的程式碼。當特定的事件發⽣時,MySQL 觸發器會
被⾃動啟用。這些事件可能包括 INSERT、UPDATE 或 DELETE 操作,以及對特定列的更改。
2、觸發器的執⾏不是由程式調⽤,也不是由⼿⼯啟動,⽽是由事件來觸發、啟用從⽽實現執⾏
3、觸發器是由⼀定的事件來觸發的,對錶的增刪改操作、不包括查詢,查詢是沒有觸發器的
4、⽣產中⼀般不透過MySQL中觸發器來實現這功能,是透過Java程式、Python程式程式碼來實現觸發器
CREATE:
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
說明:
\1. DEFINER:指定觸發器的建立者,可以是⽤戶或當前⽤戶。
\2. TRIGGER trigger_name:定義觸發器的名稱。
\3. trigger_time:指定觸發器的觸發時間,可以是BEFORE或AFTER。
\4. trigger_event:指定觸發器的觸發事件,可以是INSERT、UPDATE或DELETE。
\5. ON tbl_name:指定觸發器所在的表名。
\6. FOR EACH ROW:表示觸發器對每⼀⾏記錄都會觸發。
\7. trigger_body:觸發器的執⾏語句體,可以是SQL語句或儲存過程。
檢視觸發器
mysql> SHOW TRIGGERS\G
刪除觸發器
#DROP TRIGGER trigger_name;
mysql> DROP TRIGGER insert_user_audit;
Query OK, 0 rows affected (0.00 sec)
#快速的清空表:truncate table table_name;
mysql> truncate table users;
Query OK, 0 rows affected (0.00 sec)