MySQL 筆記8 -- 儲存過程和索引
阿新 • • 發佈:2018-12-20
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!