mysql中的索引触发器和事务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中的索引触发器和事务相关的知识,希望对你有一定的参考价值。
一.索引
1.什么是索引
如果把表看做一本书,索引就好像书里的目录或者书签,能帮助你快速找到你要检索的内容,所以叫做索引。
索引用来快速地寻找那些具有特定值的记录,所有mysql索引都以B-树的形式保存。如
果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合
要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已
经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个
记录,通过索引查找记录至少要比顺序扫描记录快100倍。
例如我们在student表中建立一个name索引(即表其中的一个列名)。若想找一个名字为“mike”的人名,只需查询这一列上的名字是否有与之匹配的 ,而不需要去查询整张表,
这样就加快了查询的速度。
2.索引的类型
1> 普通索引: 最基本的索引类型,而且它没有唯一性之类的限制
2> 唯一索引:这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值
都只能出现一次,即必须唯一
3> 主键: 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,主键可以唯一 标识一个元组。
4> 全文索引:开始支持全文索引和全文检索。在mysql中,全文索引的索引类型为 FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以 通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者 CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表 更快。
3.索引建立
1>建立聚簇索引:聚簇索引确定表中数据的物理顺序。聚簇索引类似于电话簿。由于
聚簇索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚簇索引。但该索引可
以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
聚簇索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的
行后,便可以确保包含后续索引值…
2>非聚簇索引:表明此索引的每一个索引值只对应唯一的数据记录。例如学生表按学号
建立唯一索引。
二.触发器
1.什么是触发器
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启
动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激
活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
触发器有一个非常好的特性就是:触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。
什么意思,举个例子解释一下,街机游戏大家都玩过吧,闯过一关,闯下一关,有一关没闯过就要从第一关开始。触发器和这个类似。
官方解释如下:
触发程序视为单一交易中的一部份,因此可以由原触发程序还原交易,如果在交易过程中侦测到严重的错误(如使用者中断连线),则会自动还原整个交易。
他的作用很明显了,可以保重数据的完整性。
2.触发器语法
CREATE TRIGGER <触发器名称> --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER } --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的事件:它们可以在执行insert、
update或delete的过程中触发。
ON <表名称> --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时
候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动
作,而不是对整个表执行一次。
<触发器SQL语句> --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语
句, 包括复合语句,但是这里的语句受的限制和函数的一样。
当然你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root
用户,那么就足够了。
3.触发器的作用
数据库触发器有以下的作用:
1>安全性:可以基于数据库的值使用户具有操作数据库的某种权利。
a.可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
b.可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。
2>审计: 可以跟踪用户对数据库的操作。
a.审计用户操作数据库的语句。
b.把用户对数据库的更新写入审计表。
3>实现复杂的数据完整性规则
a.实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。
b.提供可变的缺省值。
4>实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。
a.在修改或删除时级联修改或删除其它表中的与之匹配的行。
b.在修改或删除时把其它表中的与之匹配的行设成NULL值。
c.在修改或删除时把其它表中的与之匹配的行级联设成缺省值。
d.触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主键不匹配的外部键时,这种触发器会起作用。例如,可以在books.author_code 列上生成一个插入触发器,如果新值与auths.author_code列中的某值不匹配时,插入被回退。
5>同步实时地复制表中的数据。
6>自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。
三.事务
1.什么是事务
事务是一系列的数据库操作,是数据库应用程序的基本逻辑单元。事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务的开始与结束可以由用户显示控制,若用户没有显示定义事务,则由DBMS按缺省规定自动划分事务。定义事务的语句有三条:
BEGIN TRANSACCTION
COMMIT
ROLLBACK
事务通常是以BEGIN TRANSACCTION开始,以COMMIT或ROLLBACK结束。COMMIT表示提交,即提交事务的所有操作。具体说就是将事务中所有对数据库的更新写回磁盘的物理数据中去,事务正常结束。ROLLBACK表示回滚,即事务在运行的过程中发生了故障,事务不能继续执行,系统将事务中对数据库的所有完成的操作全部撤销,回滚到事务最开始的状态。这里的操作指对数据库的更新。
2.事务的特性
a.事务的原子性:一组事务,要么成功,要么撤回。
b.稳定性 : 有非法数据(外键约束之类),事务撤回。
c.隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
d.可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
3.事务中的存储引擎
MySql有一个重要的特征,被称为Pluggable Storage Engine Architecture(可替换存储引擎构架)。有两个重要的存储引擎:MyISAM 和 InnoDB 。其中MyISAM不支持事务处理,但是速度较快,InnoDB支持行锁定及事务处理,比MyISAM速度稍慢。
MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MYI存储索引。 NULL值被允许在索引的列中。
InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性, 因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump。
本文出自 “输出菱形图案” 博客,请务必保留此出处http://10541571.blog.51cto.com/10531571/1787006
以上是关于mysql中的索引触发器和事务的主要内容,如果未能解决你的问题,请参考以下文章
MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06