码迷,mamicode.com
首页 > 数据库 > 详细

mysql中的索引、触发器、和事务

时间:2016-06-07 22:40:35      阅读:533      评论:0      收藏:0      [点我收藏+]

标签: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中的索引、触发器和事务

原文地址:http://10541571.blog.51cto.com/10531571/1787006

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!