版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/83893717
MySQL 笔记8 – 存储过程和索引
MySQL 系列笔记是笔者学习、实践MySQL数据库的笔记
课程链接: MySQL 数据库基础入门教程
参考文档:
MySQL 官方文档
SQL 教程
一、存储过程
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!