我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

在滿足對某張表中數據的增、刪、改的情況下,自動觸發的功能稱之為觸發器。視圖就是通過查詢得到一張虛擬表,然後將標結果保存下來,下次直接使用即可。索引在MySQL中也叫做“鍵”,是存儲引擎用於快速找到記錄的一種數據結構。

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

觸發器

觸發程序(trigger)是一種特殊的存儲過程,它的執行不是由程序調用,也不是手工啟 動,而是通過事件進行觸發來被執行的,當對一個表進行操作(insert,delete,update)時就會激活它並執行。觸發程序經常用於加強數據的完整性約束和業務規則 等。觸發程序類似於約束,但比約束更靈活,具有更精細和更強大的數據控制能力。觸發 程序的優點如下。

⑴觸發程序的執行是自動的。當對觸發程序相關表的數據做出相應的修改後立即執行。

⑵觸發程序可以通過數據庫中相關的表進行層疊修改另外的表。

⑶觸發程序可以實施比 foreignkey 約束、check 約束更為複雜的檢查和操作。

創建

create trigger < 觸發程序名稱>


{before | after}

{insert | update | delete}

on < 表名> for each row

< 觸發程序 SQL 語句>

詳細說明:

⚫ ⑴表的擁有者即創建表的用戶可以在表上創建觸發程序,而且一個表上可以創建多個觸發程序。

⚫ ⑵create trigger:創建一個新觸發程序,並指定觸發程序的名稱。

⚫ ⑶{before | after}:用於指定在INSERT、UPDATE或 DELETE語句執行前觸發還是在語句執行後觸發。

⚫ ⑷{insert | update | delete}。

◼ INSERT:將新行插入表時激活觸發程序,例如,通過 INSERT、LOADDATA 和 REPLACE語句。

◼ UPDATE:更改某一行時激活觸發程序,例如,通過 UPDATE 語句。

◼ DELETE:從表中刪除某一行時激活觸發程序,例如,通過 DELETE 和REPLACE語句。

⚫ ⑸on:用於指定響應該觸發程序的表名。必須引用永久性表,不能將觸發程序與 TEMPORARY 表或視圖關聯起

來。

⚫ ⑹for each row:觸發程序的執行間隔,for each row 通知觸發程序每隔一行執行一次動作,而不是對整個表執行一次。

⚫ ⑺:觸發程序要執行的 SQL語句,如果該觸發程序要執行多條 SQL 語句,要將多條語句放在

BEGIN…END 塊中。

⚫ ⑻觸發程序名稱存在於方案的名稱空間內,這意味著在 1 個方案中,所有的觸發程序必須具有唯一的名稱,位於不同方

案中的觸發程序可以具有相同的名稱。

注意

對於具有相同觸發程序動作時間和事件的給定表,不能有兩個觸發程序。例如,對於 某一表,不能有兩個 before update 觸發程序。但可以有 1個 before update 觸發程序 和 1個 before insert觸發程序,或 1個 before update 觸發程序和 1個 after update 觸發程序。

示例:基於學生表和班級表

添加一個學生,數量班級的學生數量自動增加

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

限制學生的年齡段

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

刪除班級後將班級下面所有的學生刪除

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

查看

<code>show triggers /<code>
<code>show triggers [from db_ name] [like expr]/<code>

在系統表中查看

已定義好的觸發程序的信息都存儲在 INFORMATION_SCHEMA 庫中的 TRIGGERS 表中,可 以通過查看該表中的信息獲取某個觸發程序的信息

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

刪除

MySQL刪除觸發程序的語法如下。

<code>drop {database | schema} [if exists] trigger_ name/<code>

視圖

視圖(View)是一個由查詢語句定義數據內容的表,表中的數據內容就是 SQL查詢語句的 結果集,行和列的數據均來自 SQL查詢語句中使用的數據表。但之所以說視圖是虛擬的 表,是因為視圖並不在數據庫中真實存在,而是在引用視圖時動態生成的。

優勢

⚫ 使用視圖簡單,操作視圖和操作數據表完全是兩個概念,用戶不用理清數據表之間複雜的邏輯關係,而且將經常使用的

SQL 數據查詢語句定義為視圖,可以有效地避免代碼重複減少工作量。

⚫ 使用視圖安全,用戶只訪問到視圖給定的內容集合,這些都是數據表的某些行和列,避免用戶直接操作數據表引發的一

系列錯誤。


⚫ 使用視圖相對獨立,應用程序訪問是通過視圖訪問數據表,從而程序和數據表之間被視圖分離。如果數據表有變化,完

全不用去修改 SQL 語句,只需要調整視圖的定義內容,不用調整應用程序代碼。

⚫ 複雜的查詢需求。可以進行問題分解,然後將創建多個視圖獲取數據,再將視圖聯合起來就能得到需要的結果了

假如因為某種需要,a 表與 b表需要進行合併以組成一個新的表 c,最後 a 表與b表都不 存在了。而由於原來程序中編寫 SQL分別是基於 a 表與 b表查詢的,這就意味著需要重新 編寫大量的 SQL(改成向 c 表去操作數據),而通過視圖就可以不用修改 SQL。定義兩個視圖 名字還是原來的表名 a 和 b。a、b視圖完成從 c 表中取出內容。需要說明的是,使用這樣 的解決方式,基於對視圖的細節瞭解越詳細越好。因為使用視圖與使用表在語法上沒區 別。比如視圖名 a,那麼查詢還是“select*froma”。

視圖的工作機制:

當調用視圖的時候,才會執行視圖中的 SQL,進行取數據操作。視圖的內容沒有存 儲,而是在視圖被引用的時候才派生出數據。這樣不會佔用空間,由於是即時引用,視圖 的內容與真實表的內容總是一致的。視圖這樣設計最主要的好處就是比較節省空間,當數 據內容總是一樣時,就不需要維護視圖的內容,反維護好真實表的內容,就可以保證視圖 的完整性了。

創建

語法:

create [algorithm={ undefined| merge| temptable}]

view view_ name as

select column_ name( s) from table_ name

[with [cascaded| local] check option];

其中,ALGORITHM 為可選參數,表示視圖選擇的算法。

◼ UNDEFINED表示 MySQL將自動選擇所要使用的算法(默認的);

◼ MERGE 表示將視圖的語句與視圖定義合併起來,使得視圖定義的某一部分取代語 句的對應部分;

◼ TEMPTABLE 表示將視圖的結果存入臨時表,然後使用臨時表執行語句。

WITH CHECK OPTION 為可選參數,表示更新視圖時要保證在視圖的權限範圍內。

◼ CASCADED表示更新視圖時要滿足所有相關視圖和表的條件才進行更新(默認);

◼ LOCAL 表示更新視圖時,要滿足該視圖本身定義的條件即可更新。

示例:

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

表和視圖共享數據庫中相同的名稱空間,因此,數據庫不能包含具有相同名稱的表和視 圖。視圖必須具有唯一的列名,不得有重複,就像基表那樣。

修改

create or replace [algorithm={ undefined| merge| temptable}]

view 視圖

as select 語句

[with [cascaded| local] check option];

刪除

因為視圖本身只是一個虛擬表,沒有物理文件存在,所以視圖的刪除並不會刪除數據,只 是刪除掉視圖的結構定義。

<code>drop view [if exists] view_ name [, view_ name1, view_ name2...]/<code>

索引

索引是在存儲引擎中實現的,因此每種存儲引擎的索引都不一定完全相同,並且每種存儲 引擎也不一定支持所有索引類型。根據存儲引擎定義每個表的最大索引數和最大索引長 度。所有存儲引擎支持每個表至少 16 個索引,總索引長度至少為 256 字節。大多數存儲 引擎有更高的限制。MYSQL中索引的存儲類型有兩種:BTREE 和 HASH,具體和表的存儲 引擎相關;MYISAM 和 InnoDB 存儲引擎只支持 BTREE索引。

索引的優點

1、通過創建唯一索引,保證數據庫表每行數據的唯一性

2、大大加快數據查詢速度

3、在使用分組和排序進行數據查詢時,可以顯著減少查詢中分組和排序的時間

索引的缺點

1、維護索引需要耗費數據庫資源

2、索引需要佔用磁盤空間,索引文件可能比數據文件更快達到最大文件尺寸

3、當對錶的數據進行增刪改的時候,因為要維護索引,速度會受到影響

索引的分類

1、普通索引和唯一索引

主鍵索引是一種特殊的唯一索引,不允許有空值

2、單列索引和複合索引

單列索引只包含單個列

複合索引指多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字 段,索引才會被使用。使用複合索引時遵循最左前綴集合

3、全文索引

全文索引類型為 FULLTEXT,在定義索引的列上支持值的全文查找,允許在這些索引列 中插入重複值和空值。全文索引可以在 CHAR、VARCHAR、TEXT類型列上創建。MYSQL 只有 MYISAM 存儲引擎支持全文索引

4、空間索引

空間索引只能在存儲引擎為 MYISAM 的表中創建

創建索引

我們通常都是在創建好的表上面增加索引

利用 alter 語句

alter table table_name add [unique|fulltext|spatial][index|key]

[index_name](col_name[length],...) [asc|desc]

如:給學生表的姓名字段加上索引

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

利用 create 語句

create [unique|fulltext|spatial] index index_name

on table_name(col_name[length],...) [asc|desc]

普通索引

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

唯一索引

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

複合索引

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

刪除索引

alter

alter table table_name drop index index_name

drop

drop index index_name on table_name

Explain

我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺(SSS)

explain 語句輸出結果的各個行的解釋如下:

⚫ select_type: 表示查詢中每個select 子句的類型(簡單 or 複雜)

⚫ type:表示 mysql 在表中找到所需行的方式,又稱“訪問類型”:[all, index, range, ref, eq_ref, const, system, null](從左

到右,性能從差到好)

ALL:Full Table Scan, MySQL 將遍歷全表以找到匹配的行

index: Full Index Scan,index 與ALL 區別為 index 類型只遍歷索引樹

range:只檢索給定範圍的行,使用一個索引來選擇行

ref: 表示上述表的連接匹配條件,即哪些列或常量被用於查找索引列上的值

eq_ref: 類似 ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接

中使用 primary key 或者 unique key 作為關聯條件

const、system: 當 MySQL 對查詢某部分進行優化,並轉換為一個常量時,使用這些類型訪問。如將主鍵置於 where列表中,

MySQL 就能將該查詢轉換為一個常量,system 是const 類型的特例,當查詢的表只有一行的情況下,使用system

NULL: MySQL 在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列裡選取最小值可以通過單獨索引查

找完成

⚫ possible_keys :指出 MySQL 能使用哪個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引將被列出,但

不一定被查詢使用

⚫ key: 顯示 MySQL 在查詢中實際使用的索引,若沒有使用索引,顯示為 NULL

⚫ key_len :表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度

⚫ ref :表示上述表的連接匹配條件,即哪些列或常量被用於查找索引列上的值

⚫ rows :表示 MySQL 根據表統計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數

⚫ Extra :包含不適合在其他列中顯示但十分重要的額外信息 如 using where,using index

關於索引長度問題

對於 char和 varchar列,只用一列的一部分就可創建索引。創建索引時,使用 col_name(length)語法,對前綴編制索引。前綴包括每列值的前length 個字符。blob 和 text 列也可以編制索引,但是必須給出前綴長度。

使用列的一部分創建索引可以使索引文件大大減小,從而節省了大量的磁盤空間,有可能 提高 insert操作的速度


分享到:


相關文章: