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

版权声明: 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 表名;

索引属性:

扫描二维码关注公众号,回复: 4295875 查看本文章
属性 说明
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!


猜你喜欢

转载自blog.csdn.net/Wang_Jiankun/article/details/83893717
今日推荐