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 THENstatements;
ELSEelse-statements;
END IF;# CASE语句
CASE  case_expressionWHEN when_expression_1 THEN commandsWHEN when_expression_2 THEN commands...ELSE commands
END CASE;# WHILE循环
WHILE expression DOstatements
END WHILE# REPEAT循环
REPEATstatements;
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!


MySQL 笔记8 -- 存储过程和索引相关推荐

  1. MySQL笔记(五)索引 index

    这是我在学习Mysql之路上做的笔记,今天将它粘出来.这一篇主要是Mysq的l索引index.有错误的欢迎大家指出.. 数据库的创建参考我的另一篇博客 https://blog.csdn.net/cs ...

  2. MySQL 学习笔记-第三篇-索引、存储过程和函数、视图、触发器

    目录 1 索引 1.1 索引简介 1.2 创建索引 1.3 删除索引 1.4 MySQL 8.0 的新特性 1 -支持降序索引 1.5 MySQL 8.0 的新特性 2 -统计直方图 2 存储过程和函 ...

  3. mysql 学习笔记--存储引擎、索引、sq优化

    全面的 mysql学习笔记–通用语法.函数.数据类型.约束.多表查询.事务 全面的 mysql学习笔记–存储引擎.索引.sql优化 全面的mysql学习笔记–视图/存储过程/触发器.锁.InnoDB引 ...

  4. MySQL深度解析笔记(事务和索引)

    文章目录 简单了解MySQL的架构体系 事务(只用InnoDB才支持事务) 事务四大特性及原理 原子性实现原理:Undo log(回滚日志) 持久性实现原理:Redo log(前滚日志/重做日志) 隔 ...

  5. 超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

    超详细图解![MySQL进阶篇]存储过程,视图,索引,函数,触发器 1.1 下载Linux 安装包 1.2 安装MySQL 1.3 启动 MySQL 服务 1.4 登录MySQL 2\. 索引 2.1 ...

  6. mysql的存储过程和索引区别_mysql查看索引与存储过程

    mysql查看索引与存储过程创建索引: CREATE INDEX可对表增加普通索引或UNIQUE唯一索引. CREATE INDEX index_name ON table_name (column_ ...

  7. MySQL教程——2 中级篇(索引、视图、存储过程)

    1. Linux 系统安装MySQL 1.1 下载Linux 安装包 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 1.2 cent ...

  8. 徐无忌MySQL笔记:索引的使用规则

    徐无忌MySQL笔记:索引的使用规则 完成:第一遍 1.索引的使用大致分为哪两类? 单列索引 联合索引 2.单列索引? 比如:SELECT uid FROM people WHERE name='Ad ...

  9. MySQL笔记5:如何创建和删除索引?

    MySQL数据库中如何创建和删除索引? 一.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引. 1.使用CREA ...

最新文章

  1. 安全自动化在于信任,而非技术
  2. VS中添加第三方库及相对路径设置
  3. idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧
  4. P2012 拯救世界2(指数型生成函数)
  5. Div1 小A抓小B tarjan双连通分量缩点+dfs
  6. flex弹性布局操练2
  7. python做物联网控制_python实现NB-IoT模块远程控制
  8. Eclipse在线安装Hibernate插件
  9. CCIE-交换路由复习笔记
  10. 中文代码示例之Vuejs入门教程(一)
  11. hibernate的环境搭建
  12. 【转】Numpy三维数组的转置与交换轴
  13. 【面经】NLP算法-字节跳动
  14. 修改MySQL数据库最大连接数的两种方法
  15. 海康/大华/华为等摄像头或者录像机无法通过GB28181注册到国标平台LiveGBS的问题排查方法...
  16. python中plot函数参数_Python的 plot函数和绘图参数设置
  17. CuraEngine和Cura配置(Ubuntu18.04环境)
  18. 在Ubuntu下为应用程序制作自定义桌面图标
  19. 为什么选择 GPU 云服务器
  20. H3C交换机的简单配置

热门文章

  1. 网络流24题之餐巾计划问题
  2. Javascript学习笔记3 Javascript与BOM简介
  3. 一款WP小游戏代码分享
  4. JS定时器的使用--无缝滚动
  5. mongodb空间查询之查询单位
  6. 团队开发项目--校园知网 nabcd 需求分析
  7. 全选checkbox只能执行一次的问题
  8. 关于异步IO与同步IO的写操作区别
  9. 微信小程序1. Forgot to add page route in app.json. 2. Invoking Page() in async task.
  10. 分治法之循环赛日程表