MySql的表类型

MySQL支持6种不同的表类型:BDB、InnoDB、HEAP、ISAM、MERGE以及MyISAM。其中 BDB,InnoDB单独属于一类,称为“事务安全型”(transaction-safe),其余的表类型属于第二类,称为“非事务安全型”(non- transaction-safe)。

一.事物安全型

BerkeleyDB表类型:

BerkeleyDB表(TYPE=BDB)是为了满足MySQL开发者对事务安全表日益增长的需求而发展起来的。BerkeleyDB表具有很多有趣的,包括提交和回滚操作、多用户并发访问、检查点、次要索引、通过日志恢复崩溃、连续地和键控地访问数据等,这便利复杂的、基于事务的SQL有了可行的选择。

不过BerkeleyDB表也有一些限制,让我们简单的了解一下:

  • 它的移动比较困难(在创建时,表路径硬编码在表文件中)
  • 不能压缩表索引,而且其表通常比MyISAM相应的表要大
  • 有点鸡肋的感觉,因为现在InnoDB格式很大程度上可以取代BerkeleyDB格式

InnoDB表类型:

InnoDB表(TYPE=INNODB),是一个完全兼容ACID(事务的原子性、一致性、独立性及持久性)的、高效率的表完全支持MySQL的事务处理并且不会btwagkyaakftntce。精细的(行级和表级)锁提高了MySQL事务处理的带走度,同时其也支持无锁定读操作(以前只在Oracle中包含)和多版本的特性。

异步输入/输出和一系列的读缓冲将提高数据检索速度,同时可以进行文件的优化和内存的管理。需要的基础上支持自动在内存上创建散列索引来提高性能,使用缓冲来提高可靠性和数据库操作的速度。InnoDB表的恨不能可以和MyISAM相媲美,甚至已经超过了MyISAM。

在不同的操作系统和体系结构上是完全可移植的。由于一直处于一致的状态(MySQL通过在启动时检查错误并修复错误来使它们更加健壮)。对外键、提交、回滚和前滚的操作的支持,使其成为MySQL中最完善的表格式

InnoDB是事务安全的.它与BDB类型具有相同的特 性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的 INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。对于支持事物的InnoDB类 型的表,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事务(即使autocommit打 开也可以),将大大提高性能

二.非事物安全型

HELP表类型:

HEAP表(TYPE=HEAP)是内存中的表,它使用能够比较快速的散列索引(当运行INSERT查询时,独立评价指出HEAP表最少比MyISAM表快30%),因此,对于临时表可以优化。经和MyISAM或ISAM表的访问规则和使用方式一样。存储在里面的数据只在MySQL服务器的生命期内存在,如果MySQL服务器崩溃或者被关掉,都会使其中的数据消失不见。虽然HEAP表具有性能方面的好处,但是由于它的临时性和一些其他功能限制,在实际中不可能经常使用。

HEAP表的大小只受到系统上可用内存的限制,MySQL是很聪明的,其具有内建保护来阻止无意识地使用所有可用内存。所以我们不用担心内存会被HEAP表用尽。HEAP表不支持BLOB或TEXT列,不能超过max_heap_table_size变量指定的大小。

ISAM表类型:

ISAM表(TYPE=ISAM)和MyISAM表相似,但是其没有MyISAM格式的很多增强性能,因而不能像MyISAM类型那样提供很好的优化和执行效率。因为ISAM索引不能被压缩,它比在MyISAM中的相同索引战胜较少的系统资源。ISAM索引需要较多的磁盘空间,这对于像本站的这种小型环境很是问题。呵呵。

和MyISAM一样,ISAM表可以是固定长度的,也可以是可变长度的,但是其格式的最大键长度比较小, ISAM格式处理的表不能大于4G,而且表不能在不同的平台间移植。另外, ISAM表容易分裂,这会降低查询速度,对数据/索引的压缩产生限制

MERGE表类型:

MERGE是一种值得关注的新式表类型,在3.23.25版中提供。MERGE表实际上由一组同样的MyISAM表合并而成。之所以要把多个同样的表合并成一个,主要是出于性能上的考虑,因为它能够提高搜索速度、提高修复效率、节省磁盘空间。

  • MERGE表(TYPE=MERGE)是通过把多个MyISAM表组合到一个单独的表来创建的一种虚拟表。
  • 只有涉及到的表具有完全相同的表结构时才能对表进行组合。字段类型或者索引的任何不同都不能进行成功的结合。
  • MERGE表使用组成表的索引,并且不能维持它本身的索引,在某种情况下可以提高速度。
  • 允许SELECT,DELETE,UPDATE操作
  • 在需要把不同表的数据放到一起提高连接的性能或者在一系列表中进行搜索时,这种表很实用。
  • 处理大的MyISAM表时,我们可以通过压纹或者使用MySQL发布中包含的myisampack实用工具进行“打包”来减少这些表战胜的空间。myisampack创建比较小的只读表,而不会在使用智能压缩时导致任何大的性能开销。

MyISAM表类型:

MyISAM表类型是MySQL默认的表类型。MyISAM表类型以ISAM为基础,MyISAM表比ISAM表要小,因而占用资源更少。但增加了许多有用的扩展。 它是存储记录和文件的标准方法.与其他存储引擎比较, MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量 的SELECT,MyISAM是更好的选择。另外,MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝 到linux系统中使用。

  • MyISAM表(TYPE=MYISAM)是ISAM类型的一种延伸,具有很多优化和增强的特性。
  • 是MySQL的默认表类型。
  • MyISAM优化了压缩比例和速度,并且可以很方便的在不同的操作系统和平台之间进行移植。
  • MyISAM支持大表文件(大于4G)
  • 允许对BLOB和TEXT列进行索引
  • 支持使用键前缀和使用完整的键搜索记录
  • 表数据和表索引文件可以依存在不同的位置,甚至是不同的文件系统中。
  • 即使是具有相当多的插入、更新和删除操作的表,智能防碎片逻辑也能保证其高性能的协作性。


附:

数据表的可移植性

常用的数据移植方法:把数据表的内容导出到一个文本文件中,然后拷贝到硬盘上,然后导入目标数据库里面。

就文件层次的操作来说,某些数据表是可以直接单独拷贝表文件来移动的,见下表

ISAMNo
MyIASMYes
BDBNo
InnoBDBYes

注意点:
* 4.0以上mysqld都支持事务,包括非max版本。3.23的需要max版本mysqld才能支持事务。

* 创建表时如果不指定type则默认为myisam,不支持事务。可以用 show create table tablename 命令看表的类型。

* 对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交

可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全: alter table tablename type=innodb;

* innodb表不能用repair table命令和myisamchk -r table_name但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

* 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(只影响到create语句)--default-table-type=InnoDB

* 临时改变默认表类型可以用:

set table_type=InnoDB;

show variables like 'table_type';

或:

c:/mysql/bin/mysqld-max-nt --standalone --default-table-type=InnoDB

* 设置mysql用户密码应该采用如下方式(注意密码的输入方式):

       update user set password=password(‘password’) where user=’root’

* 解决Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server异常

解决方法:

1、 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%"

 

mysql -u root –p vmware mysql>use mysql; mysql>update user set host = '%' where user = 'root';mysql>select host, user from user;

 

2. 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.10.40.54' IDENTIFIED BY '123456' WITH GRANT OPTION;

* 解决JPA自动建表没有生成外键的问题

解决办法:

1、可能是数据库表的默认类型不是InnoDB,所以修改数据库表的默认类型为InnoDB。

2、数据连接的dialect如下设置

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>


转载链接:

http://blog.csdn.net/lapiggy/article/details/5837237

http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/11/05/1869813.html

http://www.cnblogs.com/qq78292959/archive/2013/01/30/2882578.html

http://esoft.iteye.com/blog/549536

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值