MySQL 笔记8 -- 存储过程和索引
生活随笔
收集整理的這篇文章主要介紹了
MySQL 笔记8 -- 存储过程和索引
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
MySQL 筆記8 – 存儲(chǔ)過程和索引
MySQL 系列筆記是筆者學(xué)習(xí)、實(shí)踐MySQL數(shù)據(jù)庫的筆記
課程鏈接: MySQL 數(shù)據(jù)庫基礎(chǔ)入門教程
參考文檔:
MySQL 官方文檔
SQL 教程
一、存儲(chǔ)過程
1、存儲(chǔ)過程
- 一組可編程的函數(shù),是為了完成特定功能的SQL語句集
- 經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫中,用戶可通過指定存儲(chǔ)過程的名字并給定參數(shù)(需要時(shí))來調(diào)用執(zhí)行
- 存儲(chǔ)過程就是具有名字的一段代碼,用來完成一個(gè)特定的功能
- 創(chuàng)建的存儲(chǔ)過程保存在數(shù)據(jù)庫的數(shù)據(jù)字典中
2、存儲(chǔ)過程優(yōu)點(diǎn)
- 將重復(fù)性很高的一些操作,封裝到一個(gè)存儲(chǔ)過程中,簡化了對(duì)這些SQL的調(diào)用
- 批量處理
- 統(tǒng)一接口,確保數(shù)據(jù)的安全
- 相對(duì)于oracle數(shù)據(jù)庫來說,MySQL的存儲(chǔ)過程相對(duì)功能較弱,使用較少
3、存儲(chǔ)過程語法
創(chuàng)建和調(diào)用:
# 創(chuàng)建存儲(chǔ)過程 CREATE PROCEDURE 名稱() DELIMITER 自定義分隔符 CREATE PROCEDURE 名稱() begin 語句1; 語句2; ... end 自定義分隔符 DELIMITER ;# 調(diào)用儲(chǔ)過程 CALL 名稱();刪除存儲(chǔ)過程:
DROP PROCEDURE 名稱查看存儲(chǔ)過程:
# 查看所有存儲(chǔ)過程 SHOW PROCEDURE STATUS;# 查看指定數(shù)據(jù)庫中的存儲(chǔ)過程 SHOW PROCEDURE STATUS WHERE db = 'My_test4';# 查看指定存儲(chǔ)過程源代碼 SHOW CREATE PROCEDURE 存儲(chǔ)過程名存儲(chǔ)過程變量:
# 聲明變量 DECLARE 變量名 數(shù)據(jù)類型(大小) DEFAULT 默認(rèn)值; DECLARE 變量名1,變量名2 數(shù)據(jù)類型(大小) DEFAULT 默認(rèn)值;# 分配變量值 SET 變量名 = 值; SELECT COUNT(*) INTO 變量名 FROM 表名存儲(chǔ)過程參數(shù): IN,OUT,INOUT
# IN:表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量) # OUT:表示過程向調(diào)用者傳出值 # INOUT:INOUT參數(shù)是IN和OUT參數(shù)的組合。 CREATE PROCEDURE 名稱([IN | OUT | INOUT ] 參數(shù)名 數(shù)據(jù)類型)存儲(chǔ)過程語句:
# IF語句 IF expression THENstatements; ELSEelse-statements; END IF;# CASE語句 CASE case_expressionWHEN when_expression_1 THEN commandsWHEN when_expression_2 THEN commands...ELSE commands END CASE;# WHILE循環(huán) WHILE expression DOstatements END WHILE# REPEAT循環(huán) REPEATstatements; UNTIL expression END REPEAT二、索引
1、索引
- 索引可以快速找出在某個(gè)列中有一特定值的行,不必查看所有數(shù)據(jù)
- 不使用索引,MySQL必須從第一條記錄開始讀完整個(gè)表,直到找出相關(guān)的行,
- 表越大,查詢數(shù)據(jù)所花費(fèi)的時(shí)間就越多
- 通過索引對(duì)數(shù)據(jù)進(jìn)行排序,降低數(shù)據(jù)排序的成本,降低了CPU的消耗
- 實(shí)際上索引也是一張表(占空間),該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄,雖然索引大大提高了查詢速度,但會(huì)降低更新表的速度,如對(duì)表進(jìn)行INSERT、UPDATE、DELETE
索引的分類:
| 單值索引 | 即一個(gè)索引只包含單個(gè)列,一個(gè)表可以有多個(gè)單列索引。 |
| 唯一索引 | 索引列的值必須唯一,但允許有空值 |
| 復(fù)合索引 | 一個(gè)索引包含多個(gè)列,INDEX MultiIdx(id,name,age) |
| 全文索引 | 只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引 |
2、索引操作
索引命令:
| 創(chuàng)建索引 | CREATE INDEX 索引名稱 ON 表名 (column[, column]…); |
| 刪除索引 | DROP INDEX 索引名稱 ON 表名 |
| 查看索引 | SHOW INDEX FROM 表名; |
索引屬性:
| Table | 表名 |
| Non_unique | 如果索引不能包括重復(fù)詞,則為0。如果可以,則為1 |
| Key_name | 索引的名稱 |
| Seq_in_index | 索引中的列序列號(hào),從1開始 |
| Column_name | 列名稱 |
| Collation | 索引的存儲(chǔ)方式,有值‘A’(升序)或NULL(無分類)。 |
| Cardinality | 索引中唯一值的數(shù)目的估計(jì)值 |
| Sub_part | 列被部分被編入索引的字符數(shù)目,如果整列被編入索引,則為NULL |
| Packed | 指示關(guān)鍵字如何被壓縮。如果沒有被壓縮,則為NULL |
| Null | 如果列含有NULL,則含有YES。如果沒有,則NO |
| Index_type | 用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 |
| Comment | 索引備注信息 |
自動(dòng)創(chuàng)建索引:
- 在表上定義了主鍵時(shí), 會(huì)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的唯一索引
- 在表上定義了一個(gè)外鍵時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)普通索引
3、解析 SELECT 語句
# 格式 EXPLAIN SELECT語句| id | SELECT的查詢序列號(hào):一條語句中該select是第幾次出現(xiàn),在次語句中select就只有一個(gè)id=1 |
| select_type | SELECT查詢類型,SIMPLE表示簡單的SELECT,即不使用UNION或子查詢 |
| table | 數(shù)據(jù)表的名字,他們按被讀取的先后順序排列 |
| type | 指定本數(shù)據(jù)表和其他數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系 |
| key | 實(shí)際選用的索引 |
| possible_keys | MySQL搜索數(shù)據(jù)記錄時(shí)可以選用的索引 |
| key_len | 使用的索引個(gè)數(shù) |
| ref | 給出關(guān)聯(lián)關(guān)系中另一個(gè)數(shù)據(jù)表中數(shù)據(jù)列的名字 |
| rows | MySQL在執(zhí)行這個(gè)查詢時(shí)預(yù)計(jì)會(huì)從這個(gè)數(shù)據(jù)表里讀出的數(shù)據(jù)行的個(gè)數(shù) |
| extra | 提供了與關(guān)聯(lián)操作有關(guān)的信息,沒有則什么都不寫 |
4、索引結(jié)構(gòu)
- B 數(shù)索引:平衡的多叉搜索樹,查找時(shí)從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)逐級(jí)查找
- hash(哈希)索引:哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時(shí)不需要類似B+樹那樣從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)逐級(jí)查找,只需一次哈希算法即可立刻定位到相應(yīng)的位置,速度非常快
5、是否需要索引
需要索引的情況:
- 主鍵自動(dòng)建立唯一索引
- 頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引
- 查詢中與其他表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引
- 查詢中排序的字段,排序的字段若通過索引去訪問將大大提高排序速度
- 查詢中統(tǒng)計(jì)或者分組字段
不需要索引的情況:
- 表記錄太少
- 頻繁更新的字段不適合建立索引,因?yàn)槊看胃虏粏螁问歉铝擞涗涍€會(huì)更新索引
- 如果某個(gè)數(shù)據(jù)列包含許多重復(fù)的內(nèi)容,為它建立索引就沒有太大的實(shí)際效果
- WHERE條件里用不到的字段不創(chuàng)建索引
GOOD LUCK!
總結(jié)
以上是生活随笔為你收集整理的MySQL 笔记8 -- 存储过程和索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC拦截器(interce
- 下一篇: MySQL 笔记9 -- PyMySQ