Mysql第九天 内部存储代码、绑定变量

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: <div class="markdown_views"><h2 id="内部存储代码">内部存储代码</h2><p>主要有,存储过程、函数、时间、触发器 <br>优点:</p><ul><li>方便代码重用</li><li>离数据进,执行起来可以节省带宽和网络延迟</li><li>mysql可以缓存存储过程的执行计划,这样可以降低生成执行计划的消耗 <br>缺

内部存储代码

主要有,存储过程、函数、时间、触发器
优点:

  • 方便代码重用
  • 离数据进,执行起来可以节省带宽和网络延迟
  • mysql可以缓存存储过程的执行计划,这样可以降低生成执行计划的消耗
    缺点:
  • 存储过程开发起来没有好的调试工具
  • 没有很多可用的库,因此复杂逻辑实现起来麻烦
  • 不安全,不能控制存储过程的资源消耗,也不好监测,会直接把程序拖死。
    这里具体的写法就不说了,只是说一下用法,以及一些优缺点。个人因为存储过程的水平实在是差,基本上没写过,所以潜意识有抵触,非必要情况下都是能不用就不用。

存储过程和函数

在代码中用Call调用。
比较适合做统计,而不适合日常的插入和查询,感觉跟事件配合起来做定时任务来 计算一些归档类的,统计类的内容比较合适

触发器

在行操作的时候,提供一些触发点,可以定义被触发后执行sql语句。一般可以有一下的用法,或者需要注意的地方:

  • 做缓存或者统计表的更新操作。 但是因为现在分布式key-value缓存的流行,及触发器本身的行操作机制,不适合做批量的更新等操作,因此比较少用
  • 自己实现外键,因为外键维护需要性能,可以再应用程序张维护外键关系。还可以使用触发器的BEFROE INSERT做外键检查,但是要注意,如果触发器中没有使用SELECT FOR UPDATE就有可能导致数据不一致。又因为INNODB触发器是在同一个事务中,所以数据不一致的概率比较低
  • 在一些特定的复制场景有用,比如用户各自在自己的库上进行操作,然后这个操作同步到主库,再把所有操作分发给所有用户。 这样就可以使用触发器,在用户在本地库插入数据的时候同步主库,然后利用主题的复制功能
    大体的做法是:
// 先做一DB_LINK   ,link_name
CREATE OR REPLACE TRIGGER tg_name
BEFORE 
insert
ON t_sb_info
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW 
BEGIN
   insert into t_table1@link_name select *from t_table1 where year=:new.year and month=:new.month;
   insert into t_table2@link_name select *from t_table2 where year=:new.year and month=:new.month;
END;

事件

  • 基本使用就是定时执行存储过程
  • 跟存储过程一样,不适合复制,而仅仅是执行结果之后,复制结果
  • 可以在表INFOMATION_SCHEMA.EVENTS中看到各个事件状态。
  • 可能面临,一个任务没执行完,下一个已经开始的问题。可以用GET_LOCK()来确保当前总是只有一个事件在被执行。
  • 事件不会用到连接线程,会有自己的事件线程,执行完之后销毁而不会缓存。通过设置 SET CLOBAL event_scheduler :=1;来开启。

绑定变量

这个就是Java里面的PreparedStatement了。

PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt.setString(1, "Hi");
for (int i = 0; i < 10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}

这样一个更新的sql语句分成了两部,第一步是把带?的sql语句发送到服务器做预编译。第二步就是设置参数并且执行了。

这样做会有如下的好处:

  • 解析一次sql
  • 执行计划会有部分缓存
  • 二进制的方式只发送参数和句柄减少通信量
    还有一种预发可以SQL接口绑定变量,这个不常用不说了

限制

  • 会话级别的
  • 如果只执行一次的SQL,使用绑定变量会多一次通讯的开销
  • 不要忘记释放使用绑定变量的资源,因为mysql对这个有一个上线

SQL注入

使用绑定变量还能够额外获得一个好处,即能够防止SQL注入攻击。
比如登陆的时候我们的代码是这样的:

String sql = "SELECT COUNT(*) FROM user WHERE username='"+ username+"' AND password ='"+ password +"';"
// 如果password 传入 ' OR '1'='1这个时候sql就变成了:
// SELECT COUNT(*) FROM user WHERE username='wzj' AND password = '' OR '1'='1'
这个时候就是查询所有,就相当于永远为true了。

使用绑定变量就可以有效的避免这个问题。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 关系型数据库 MySQL
Linux 安装 mysql 及配置存储位置
Linux 安装 mysql 及配置存储位置
140 3
|
3月前
|
存储 关系型数据库 MySQL
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
146 0
|
18天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
78 6
|
25天前
|
存储 自然语言处理 关系型数据库
MySQL 自定义变量并声明字符编码
MySQL 自定义变量并声明字符编码
39 1
|
3月前
|
存储 关系型数据库 MySQL
mysql 使用变量存储中间结果的写法
mysql 使用变量存储中间结果的写法
|
15天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
16 2
|
25天前
|
存储 SQL 关系型数据库
MySQL 存储函数及调用
MySQL 存储函数及调用
16 3
|
26天前
|
存储 关系型数据库 MySQL
MySQL 如何存储地理信息
MySQL 如何存储地理信息
57 1
|
2月前
|
存储 关系型数据库 MySQL
深入解析MySQL数据存储机制:从表结构到物理存储
深入解析MySQL数据存储机制:从表结构到物理存储
50 1
|
15天前
|
关系型数据库 MySQL 数据处理
企业级应用 mysql 日期函数变量,干货已整理
本文详细介绍了如何在MySQL8.0中使用DATE_FORMAT函数进行日期格式的转换,包括当日、昨日及不同时间段的数据获取,并提供了实际的ETL应用场景和注意事项,有助于提升数据处理的灵活性和一致性。
35 0