1. 程式人生 > >MySQL 筆記8 -- 儲存過程和索引

MySQL 筆記8 -- 儲存過程和索引

MySQL 筆記8 – 儲存過程和索引

MySQL 系列筆記是筆者學習、實踐MySQL資料庫的筆記

一、儲存過程

1、儲存過程

  • 一組可程式設計的函式,是為了完成特定功能的SQL語句集
  • 經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行
  • 儲存過程就是具有名字的一段程式碼,用來完成一個特定的功能
  • 建立的儲存過程儲存在資料庫的資料字典中

2、儲存過程優點

  • 將重複性很高的一些操作,封裝到一個儲存過程中,簡化了對這些SQL的呼叫
  • 批量處理
  • 統一介面,確保資料的安全
  • 相對於oracle資料庫來說,MySQL的儲存過程相對功能較弱,使用較少

3、儲存過程語法

建立和呼叫:

# 建立儲存過程
CREATE PROCEDURE 名稱()
DELIMITER 自定義分隔符
CREATE PROCEDURE 名稱()
begin
語句1;
語句2;
...
end 自定義分隔符
DELIMITER ;

# 呼叫儲過程
CALL  名稱();

刪除儲存過程:

DROP PROCEDURE  名稱

檢視儲存過程:

# 檢視所有儲存過程
SHOW PROCEDURE STATUS;

# 檢視指定資料庫中的儲存過程
SHOW PROCEDURE STATUS WHERE db = 'My_test4';

# 檢視指定儲存過程原始碼
SHOW CREATE PROCEDURE 儲存過程名

儲存過程變數:

# 宣告變數
DECLARE 變數名 資料型別(大小) DEFAULT 預設值;
DECLARE 變數名1,變數名2 資料型別(大小) DEFAULT 預設值;

# 分配變數值
SET 變數名 = 值;
SELECT COUNT(*) INTO 變數名 FROM 表名

儲存過程引數: IN,OUT,INOUT

# IN:表示呼叫者向過程傳入值(傳入值可以是字面量或變數)
# OUT:表示過程向呼叫者傳出值
# INOUT:INOUT引數是IN和OUT引數的組合。
CREATE PROCEDURE 名稱([IN | OUT | INOUT ] 引數名 資料型別)

儲存過程語句:

# IF語句
IF expression THEN
   statements;
ELSE
   else-statements;
END IF;

# CASE語句
CASE  case_expression
   WHEN when_expression_1 THEN commands
   WHEN when_expression_2 THEN commands
   ...
   ELSE commands
END CASE;

# WHILE迴圈
WHILE expression DO
   statements
END WHILE

# REPEAT迴圈
REPEAT
 statements;
UNTIL expression
END REPEAT

二、索引

1、索引

  • 索引可以快速找出在某個列中有一特定值的行,不必檢視所有資料
  • 不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,
  • 表越大,查詢資料所花費的時間就越多
  • 通過索引對資料進行排序,降低資料排序的成本,降低了CPU的消耗
  • 實際上索引也是一張表(佔空間),該表儲存了主鍵與索引欄位,並指向實體表的記錄,雖然索引大大提高了查詢速度,但會降低更新表的速度,如對錶進行INSERT、UPDATE、DELETE

索引的分類:

類別 說明
單值索引 即一個索引只包含單個列,一個表可以有多個單列索引。
唯一索引 索引列的值必須唯一,但允許有空值
複合索引 一個索引包含多個列,INDEX MultiIdx(id,name,age)
全文索引 只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT型別欄位上使用全文索引

2、索引操作

索引命令:

功能 命令
建立索引 CREATE INDEX 索引名稱 ON 表名 (column[, column]…);
刪除索引 DROP INDEX 索引名稱 ON 表名
檢視索引 SHOW INDEX FROM 表名;

索引屬性:

屬性 說明
Table 表名
Non_unique 如果索引不能包括重複詞,則為0。如果可以,則為1
Key_name 索引的名稱
Seq_in_index 索引中的列序列號,從1開始
Column_name 列名稱
Collation 索引的儲存方式,有值‘A’(升序)或NULL(無分類)。
Cardinality 索引中唯一值的數目的估計值
Sub_part 列被部分被編入索引的字元數目,如果整列被編入索引,則為NULL
Packed 指示關鍵字如何被壓縮。如果沒有被壓縮,則為NULL
Null 如果列含有NULL,則含有YES。如果沒有,則NO
Index_type 用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment 索引備註資訊

自動建立索引:

  • 在表上定義了主鍵時, 會自動建立一個對應的唯一索引
  • 在表上定義了一個外來鍵時,會自動建立一個普通索引

3、解析 SELECT 語句

# 格式
EXPLAIN SELECT語句
資訊 說明
id SELECT的查詢序列號:一條語句中該select是第幾次出現,在次語句中select就只有一個id=1
select_type SELECT查詢型別,SIMPLE表示簡單的SELECT,即不使用UNION或子查詢
table 資料表的名字,他們按被讀取的先後順序排列
type 指定本資料表和其他資料表之間的關聯關係
key 實際選用的索引
possible_keys MySQL搜尋資料記錄時可以選用的索引
key_len 使用的索引個數
ref 給出關聯關係中另一個數據表中資料列的名字
rows MySQL在執行這個查詢時預計會從這個資料表裡讀出的資料行的個數
extra 提供了與關聯操作有關的資訊,沒有則什麼都不寫

4、索引結構

  • B 數索引:平衡的多叉搜尋樹,查詢時從根節點到葉子節點逐級查詢
  • hash(雜湊)索引:雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可立刻定位到相應的位置,速度非常快

5、是否需要索引

需要索引的情況:

  • 主鍵自動建立唯一索引
  • 頻繁作為查詢條件的欄位應該建立索引
  • 查詢中與其他表關聯的欄位,外來鍵關係建立索引
  • 查詢中排序的欄位,排序的欄位若通過索引去訪問將大大提高排序速度
  • 查詢中統計或者分組欄位

不需要索引的情況:

  • 表記錄太少
  • 頻繁更新的欄位不適合建立索引,因為每次更新不單單是更新了記錄還會更新索引
  • 如果某個資料列包含許多重複的內容,為它建立索引就沒有太大的實際效果
  • WHERE條件裡用不到的欄位不建立索引

GOOD LUCK!