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。

时间: 2024-08-05 10:54:04

mysql中的索引、触发器、和事务的相关文章

mysql之视图,触发器,事务等。。。

mysql之视图,触发器,事务等... 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推

一步一步带你入门MySQL中的索引和锁 (转)

出处: 一步一步带你入门MySQL中的索引和锁 索引 索引常见的几种类型 索引常见的类型有哈希索引,有序数组索引,二叉树索引,跳表等等.本文主要探讨 MySQL 的默认存储引擎 InnoDB 的索引结构. InnoDB的索引结构 在InnoDB中是通过一种多路搜索树——B+树实现索引结构的.在B+树中是只有叶子结点会存储数据,而且所有叶子结点会形成一个链表.而在InnoDB中维护的是一个双向链表. 你可能会有一个疑问,为什么使用 B+树 而不使用二叉树或者B树? 首先,我们知道访问磁盘需要访问到

mysql中查看索引是否被使用到

http://blog.sina.com.cn/s/blog_5037eacb0102vm5c.html 官方MySQL中查看索引是否被使用到: 在percona版本或marida中可以通过 information_schea.index_statistics查看得到, 在官方版本中如何查看呢? select object_type,object_schema,object_name,index_name,count_star,count_read,COUNT_FETCH from perfor

Mysql中的索引

众所周知,索引能够加快查询的速度,类似看书的时候先查目录之后再翻到具体那一页. 一.聚集索引和非聚集索引 1.聚集索引 聚集索引一张表只能存在一个. 聚集索引是物理上连续的(如果数据结构是btree的话,则数据直接存在叶子节点上),所以查询一个范围的数据会相当快. 2. 非聚集索引 非聚集索引一张表可以存在抖个. 非聚集索引在逻辑上是连续的(如果数据结构是btree的话,则叶子节点上存的的数据的位置信息),所以 mysql中的innodb引擎支持聚集索引,在mysql中主键索引就是聚集索引. M

(转)MySQL中的索引详讲

序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是我认为,不管有没有用,现在学着不懂的东西,说明就是自己薄弱的地方,多学才能比别人更强 --WH 一.什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有

MySQL中是索引

MySQL中是索引: --.唯一索引: 一行中的内容不能一样, create t2( id int , num int, unique weiyisuiyin (id,num) ) --唯一; --约束不能重复(可以为空) --主键不能重复 --加速查找 一个表中可以有多列索引,组合起来具有唯一性; 原文地址:https://www.cnblogs.com/tataerzu/p/10165603.html

MySQL中的索引详讲

一.什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间. 例如:有一张person表,其中有2W条记录,记录着2W个人的信息.有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息. 如果没有索引,那么将从表中第一条

mysql的 视图、触发器、事务、存储过程、函数、索引与慢查询优化

视图 假设有两张表学生和老师,学生表(sid,name,tid)关联老师表(tid,tname) 创建视图的语法: create view 视图名 as SQL语句 实例: create view student2teacher as select * from student inner join teacher on student.tid=teacher.tid; 创建视图后会产生一个名为 student2teacher 的表,可以直接调用. 思考:开发过程中会不会去使用视图? 不会!视图

十二、mysql之视图,触发器,事务等

一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 -- 1.视图是一个虚拟表(非正