MySQL 笔记8 -- 存储过程和索引

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语句
信息说明
idSELECT的查询序列号:一条语句中该select是第几次出现,在次语句中select就只有一个id=1
select_typeSELECT查询类型,SIMPLE表示简单的SELECT,即不使用UNION或子查询
table数据表的名字,他们按被读取的先后顺序排列
type指定本数据表和其他数据表之间的关联关系
key实际选用的索引
possible_keysMySQL搜索数据记录时可以选用的索引
key_len使用的索引个数
ref给出关联关系中另一个数据表中数据列的名字
rowsMySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数
extra提供了与关联操作有关的信息,没有则什么都不写

4、索引结构

  • B 数索引:平衡的多叉搜索树,查找时从根节点到叶子节点逐级查找
  • hash(哈希)索引:哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快

5、是否需要索引

需要索引的情况:

  • 主键自动建立唯一索引
  • 频繁作为查询条件的字段应该创建索引
  • 查询中与其他表关联的字段,外键关系建立索引
  • 查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
  • 查询中统计或者分组字段

不需要索引的情况:

  • 表记录太少
  • 频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
  • 如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果
  • WHERE条件里用不到的字段不创建索引

GOOD LUCK!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值