- 浏览: 66030 次
- 性别:
- 来自: 江苏
文章分类
最新评论
-
donghustone:
楼主好强大!!
resin2.1.17 官方下载地址 -
MultiArrow:
这么说的话好像就只有CentOS没有一个比较强的企业在使用。。 ...
诸多linux,但选一个做服务器
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类 型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而 InnoDB提供事务支持已经外部键等高级数据库功能。
以下是一些细节和具体实现的差别:
◆1.InnoDB不支持FULLTEXT类型的索引。
◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。
MySQL5.X都已经发布好久了,但是还有很多人认为MySQL是不支持事务处理的,这不得不怪他们是孤陋寡闻的,其实,只要你的MySQL版本 支持BDB或InnoDB表类型,那么你的MySQL就具有事务处理的能力。这里面,又以InnoDB表类型用的最多,虽然后来发生了诸如Oracle收 购InnoDB等令MySQL不爽的事情,但那些商业上的斗争与技术无关,下面以InnoDB表类型为例简单说一下MySQL中的事务。
先来明确一下事务涉及的相关知识:
事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
再来看看哪些问题会用到事务处理:
这里不说“银行转帐”的例子了,说一个大家实际更容易遇到的“网上购书”的例子。先假设一下问题的背景:网上购书,某书(数据库编号为123)只剩最后一本,而这个时候,两个用户对这本书几乎同时发出了购买请求,让我们看看整个过程:
在具体分析之前,先来看看数据表的定义:
-------------------------------------------------------------------------------
create table book
(
book_id unsigned int(10) not null auto_increment,
book_name varchar(100) not null,
book_price float(5, 2) not null, #我假设每本书的价格不会超过999.99元
book_number int(10) not null,
primary key (book_id)
)
type = innodb; #engine = innodb也行
-------------------------------------------------------------------------------
对于用户甲来说,他的动作稍微比乙快一点点,其购买过程所触发的动作大致是这样的:
-------------------------------------------------------------------------------
1. SELECT book_number FROM book WHERE book_id = 123;
book_number大于零,确认购买行为并更新book_number
2. UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;
购书成功
-------------------------------------------------------------------------------
而对于用户乙来说,他的动作稍微比甲慢一点点,其购买过程所触发的动作和甲相同:
-------------------------------------------------------------------------------
1. SELECT book_number FROM book WHERE book_id = 123;
这个时候,甲刚刚进行完第一步的操作,还没来得及做第二步操作,所以book_number一定大于零
2. UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;
购书成功
-------------------------------------------------------------------------------
表面上看甲乙的操作都成功了,他们都买到了书,但是库存只有一本,他们怎么可能都成功呢?再看看数据表里book_number的内容,已经变成 “-1”了,这当然是不能允许的(实际上,声明这样的列类型应该加上unsigned的属性,以保证其不能为负,这里是为了说明问题所以没有这样设置)
好了,问题陈述清楚了,再来看看怎么利用事务来解决这个问题,打开MySQL手册,可以看到想用事务来保护你的SQL正确执行其实很简单,基本就是三个语句:开始,提交,回滚。
-------------------------------------------------------------------------------
开始:START TRANSACTION或BEGIN语句可以开始一项新的事务
提交:COMMIT可以提交当前事务,是变更成为永久变更
回滚:ROLLBACK可以回滚当前事务,取消其变更
此外,SET AUTOCOMMIT = {0 | 1}可以禁用或启用默认的autocommit模式,用于当前连接。
-------------------------------------------------------------------------------
那是不是只要用事务语句包一下我们的SQL语句就能保证正确了呢?比如下面代码:
-------------------------------------------------------------------------------
BEGIN;
SELECT book_number FROM book WHERE book_id = 123;
// ...
UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;
COMMIT;
-------------------------------------------------------------------------------
答案是否定了,这样依然不能避免问题的发生,如果想避免这样的情况,实际应该如下:
-------------------------------------------------------------------------------
BEGIN;
SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE;
// ...
UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;
COMMIT;
-------------------------------------------------------------------------------
由于加入了FOR UPDATE,所以会在此条记录上加上一个行锁,如果此事务没有完全结束,那么其他的事务在使用SELECT ... FOR UPDATE请求的时候就会处于等待状态,直到上一个事务结束,它才能继续,从而避免了问题的发生,需要注意的是,如果你其他的事务使用的是不带FOR UPDATE的SELECT语句,将得不到这种保护。
最后看看PHP + MySQL事务操作的代码演示:
实际LAMP应用中,一般PHP使用AdoDB操作MySQL,下面给出AdoDB相应的代码方便大家查阅:
-------------------------------------------------------------------------------
<?php
// ...
$adodb->startTrans();
//实际,getOne所调用的查询也可以直接放到rowLock来进行,这里只是为了演示效果能更明显些。
$adodb->rowLock('book', 'book_id = 123');
$bookNumber = $adodb->getOne("SELECT book_number FROM book WHERE book_id = 123");
$adodb->execute("UPDATE book SET book_number = book_number - 1 WHERE book_id = 123");
$adodb->completeTrans();
// ...
?>
-------------------------------------------------------------------------------
其中,rowLock的方法就是调用的FOR UPDATE来实现的行锁,你可能会想把“FOR UPDATE”直接写到$adodb->getOne()调用的那条SQL语句里面去实现行锁的功能,不错,那样确实可以,但是并不是所有的数据库 都使用“FOR UPDATE”语法来实现行锁功能,比如Sybase使用“HOLDLOCK”的语法来实现行锁功能,所以为了你的数据库抽象层保持可移植性,我还是劝你 用rowLock来实现行锁功能,至于可移植性就交给AdoDB好了,嗯,有点扯远了,今儿就说到这里了。
-------------------------------------------------------------------------------
MyISAM:不支持事务,用于只读程序提高性能
InnoDB:支持ACID事务、行级锁、并发
Berkeley DB:支持事务
发表评论
-
crontab 中使用环境变量
2012-11-12 09:40 1944环境:(产品,平台,机型,软件版本,等)AIX5L 问 ... -
mysql 里常用的函数
2010-08-30 11:46 862以前用oracle的nvl等函数很方便,mysql的不熟悉,用 ... -
dll already loaded in another classloader 错误解决
2010-08-24 13:40 2484遇到此问题,从网上找了下答案,记录之 是由于web重启 ... -
使用javamail发邮件报错
2010-08-07 17:12 1950使用myeclipse 开发 javaee1. ... -
【转】集群中几种session同步解决方案的比较
2010-07-29 22:43 1028集群中几种session同步解决方案的比较 ... -
apache workers.properties
2010-06-26 14:43 1217[转]http://hi.baidu.com/youdianw ... -
apache2.2 tomcat6 jk 负载均衡, 做backup server
2010-06-26 14:32 17031.下载 在http://tomcat.apache.org/ ... -
xp远程连接win2008
2009-12-07 22:16 978xp远程桌面连接不支持nla,网络及身份验证,在注册表里修改如 ... -
apache ab 使用
2010-04-22 23:29 698格式: ./ab [options] [http://]hos ... -
[转]三大WEB服务器(Apache ,Lighttpd,Nginx)对比分析
2010-04-23 01:07 678一.软件介绍(apache lig ... -
resin2.1.17 官方下载地址
2010-04-23 02:34 2456官网上已经没有相关下载链接,但是文件还在,趁早下吧,用3以上版 ... -
raid 名词解释
2010-05-26 17:06 955RAID级别为不同冗余类型在逻辑驱动器上的应用。 它可以提高逻 ... -
诸多linux,但选一个做服务器
2010-05-28 00:01 1270RHEL对于我们来说最大的 ... -
win2008server 安全配置
2010-06-06 20:28 988【转】系统安装 分区: 服务器的硬盘是320G,分成了4 ... -
myeclips resin 出现 a full jdk must be specified 错误
2010-06-13 19:02 953到window/Preferences/java->in ... -
apache resin ngnix 性能比较
2010-06-15 01:56 1284静态页面测试,静态页面包括css,js,img ab -c 2 ... -
DNS 服务器 清除缓存
2010-06-22 11:05 1362DNS 缓存不及时清理会导致解析错误,网页打不开。server ...
相关推荐
### MySQL 数据库引擎 MyISAM 与 InnoDB 在 MySQL 数据库系统中,存在多种不同的存储引擎,其中最为人所熟知且广泛使用的两种是 MyISAM 和 InnoDB。这两种存储引擎各自具有独特的特点和适用场景。 #### InnoDB:...
MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...
MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们各自拥有不同的特点和适用场景。 #### MyISAM引擎概述 MyISAM是MySQL早期默认使用的存储引擎,它主要适用于读取密集型的应用场景。MyISAM支持表级锁定,这意味...
MySQL存储引擎--MyISAM与InnoDB区别 MySQL是一种关系型数据库管理系统,它支持多种存储引擎,每种存储引擎都有其特点和优缺。MyISAM和InnoDB是MySQL中最常用的两种存储引擎,它们都有其优缺点,本文将对比MyISAM...
在MySQL中,MyISAM和InnoDB是最常见的两种存储引擎,它们各自有独特的特性和适用场景。 首先,我们来看一下MySQL默认存储引擎的变迁。在MySQL 5.1之前的版本,MyISAM是默认的存储引擎,它以快速读取和较小的内存...
mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。 查看当前数据库的所支持的数据库引擎以及默认数据库引擎 数据库支持的引擎和默认数据库引擎代码: 代码如下:show engines; ...
### 将MySQL从MyISAM转换成InnoDB的错误与解决方法 #### 一、问题背景及概述 本文主要探讨了在将MySQL数据库从MyISAM引擎转换为InnoDB引擎时遇到的问题及其解决方法。作者最初使用的是一款仅支持MyISAM引擎的非...
在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问。为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数据库引擎(5.5版之前),由...
在MySQL数据库系统中,MyISAM与InnoDB是最常被提及的两种存储引擎。这两种引擎在功能、性能以及适用场景上存在显著差异,本文将深入探讨这两者之间的区别,并分析它们各自的优势及应用场景。 #### 一、基本概念 - ...
### MySQL存储引擎详解:MyISAM与InnoDB的主要区别 #### 一、概述 MySQL作为一款广泛使用的开源关系型数据库管理系统,提供了多种存储引擎供用户根据不同的应用场景选择。其中最常用的两种存储引擎分别是MyISAM和...
虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了。可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引擎呢?下面我们分别来看...
MySQL 数据存储引擎 InnoDB 和 MyISAM 的优势及区别分享 MySQL 数据存储引擎 InnoDB 和 MyISAM 是 MySQL 中最常用的两个表类型,每种类型都有其优缺点,本文将详细介绍 InnoDB 和 MyISAM 的特点、优缺点和应用场景...
本文主要讨论两种常见的存储引擎——MyISAM和InnoDB,它们在B+树索引实现上的差异。 首先,MyISAM是MySQL早期的默认存储引擎,它在索引方面采用B+树结构。对于主键索引,MyISAM的B+树叶节点存储的是数据记录的物理...
两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。 我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我...
InnoDB的物理文件结构与MyISAM不同,它将表数据和索引数据存储在一起,并使用单独的日志文件来保证事务回滚和崩溃恢复。InnoDB支持BTree、R-Tree和Hash索引,其索引实现与MyISAM有所不同。InnoDB引入了行级锁,这极...
MyISAM和InnoDB是MySQL中两种最常使用的存储引擎,它们各有特点,适用于不同的应用场景。 1. **事务处理**: - **InnoDB** 支持ACID(原子性、一致性、隔离性、持久性)事务,提供事务安全,适合需要事务处理的...