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

内部存储代码

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

  • 方便代码重用
  • 离数据进,执行起来可以节省带宽和网络延迟
  • 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了。

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

时间: 2024-08-31 07:24:47

Mysql第九天 内部存储代码、绑定变量的相关文章

ASP.NET技巧:前台页面代码绑定后台程序变量

ASP.NET编程经常会碰到在前台页面代码中要使用(或绑定)后台程序中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方面,这里所讲的前台即通常的.aspx文件,后台指的是与aspx相关联的CodeBehind,文件后缀名为.aspx.cs:另一方面,这里的绑定是指用户发出访问某一页面指令后,服务器端在执行过程中就已经将前台代码进行了赋值,而后生成html格式回传客户端显示,而并非已经显示到客户端后,然后

ASP.NET教程:汇总前台代码绑定后台变量的方法

经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方面,这里所讲的前台即通常的.aspx文件,后台指的是与aspx相关联的CodeBehind,文件后缀名为.aspx.cs:另一方面,这里的绑定是指用户发出访问某一页面指令后,服务器端在执行过程中就已经将前台代码进行了赋值,而后生成html格式回传客户端显示,而并非已经显示到客户端后,然后通过其他方法(如aja

ASP.NET前台代码绑定后台变量方法

网页特效代码中 html显示内容的位置(也就是开始标签与结束标签之间的内容,如<div>这里</div>(html标签)或者<asp教程:label id="label2" runat="server" text="label">这里</asp:label>(服务器端控件),它作为占位符把变量显示于符号出现的 对于第一种位置,有一些约束条件: (1)一般的属性要求是字符串型或数值型(下面会提到有些服

一起谈.NET技术,ASP.NET前台代码绑定后台变量方法总结

经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方面,这里所讲的前台即通常的.aspx文件,后台指的是与aspx相关联的CodeBehind,文件后缀名为.aspx.cs:另一方面,这里的绑定是指用户发出访问某一页面指令后,服务器端在执行过程中就已经将前台代码进行了赋值,而后生成html格式回传客户端显示,而并非已经显示到客户端后,然后通过其他方法(如aja

ASP.NET前台代码绑定后台变量方法总结

经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方面,这里所讲的前台即通常的.aspx文件,后台指的是与aspx相关联的CodeBehind,文件后缀名为.aspx.cs:另一方面,这里的绑定是指用户发出访问某一页面指令后,服务器端在执行过程中就已经将前台代码进行了赋值,而后生成html格式回传客户端显示,而并非已经显示到客户端后,然后通过其他方法(如aja

内部js代码获取后台变量

Java Web中,内部js代码如何获取服务器后台的变量呢? 根据jsp页面使用的标签不同有一下几种情况: (1)页面使用EL表达式,使用spring MVC 内部js代码: Js代码   alert("222:${sessionScope.practiceWay}");   var practiceWay=String("${sessionScope.practiceWay}");     (2)页面使用struts标签 Js代码   var length=Num

oracel中sql语句和pl/sql语句使用绑定变量

关于绑定变量的用法: 之前的文章介绍了绑定变量对于系统的重要性,这里对绑定变量的使用做进一步的分析和说明. 1)在sql语句中如何带入bind value SQL> variable x number; SQL> exec :x:=100; PL/SQL procedure successfully completed. SQL> select * from t where id=:x; no rows selected SQL> exec :x:=101; SQL> sel

Uber是如何使用MySQL设计可扩展性数据存储的?

在Mezzanine项目中我们描述了我们是如何将Uber的核心行程数据从单个的Postgres节点迁移到Schemaless,这是我们开发的一个容错性很高.可用的数据存储. 根据Uber工程师的习惯使用MySQL设计的数据存储,使我们可以从2014 扩容到更高.本文分成三部分对Schemaless进行阐述. 一.Schemaless的总体设计   这一部分我们将讲述Schemaless的架构它在Uber基础结构中的角色以及他是如何成为该角色的. 1.我们对新数据库的迫切需求 2014年初,由于出

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情 1. 基本原则 2. 三个条件的说明 2.1 应用客户端 2.2 应用到 RDS MySQL 实例的连接 2.3 RDS 实例配置 3. 通过 set names 命令设置会话字符集 1. 基本原则 如果要实现存储 emoji 表情到 RDS for MySQL 实例,需要应用客户端.到 RDS for MySQL 实例的连接.RDS 实例内部 3 个方面统一使用或者支持 utf8mb4 字符集. 注:关于 utf8