最近要用到表事务中的一些回滚处理,所以看了一下InnoDB相关的资料。
有兴趣的自已去啃,传送门:http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html
MYSQL中myisam和innodb引擎的区别
MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。
讲讲你对mysql myisam和innodb的认识。然后你认为他们的区别在那里?为什么?
答:这两个是MySQL主要存储引擎。
简要介绍来自官网。
简要介绍:myIsam
myIdam是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL5.1不支持ISAM)。
每个myisam在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD(MYData)。索引文件的扩展名是.MYI(MYIndex)。
简要介绍:InnoDB
InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在myisam表中每个表被存在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。
InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在InnoDB上。Mytrix Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
简单概括几点如下:
1. 通过以上不难看出,myIsam InnoDB的用途,myisam主要适用于中小型数据量。InnoDB引擎适用于大数据量。上面已经讲得很清楚拉。著名的开源电子商务系统[magento]就是采用InnoDB创建。
2. myIsam写入速度比InnoDB快。
3. 在使用InnoDB时候需要对my.cnf进行配置以保证MySQL达到最大效率。详细可以查看官网[inndo性能调节]:
SHOW TABLE STATUS
上面这条SQL可以查看当前数据库下的表状态,如下图:
Name | Engine | Version |
tbl_user | InnoDB | 10 |
tbl_address | InnoDB | 10 |
tbl_user
id | name | password | |
1 | xiaoming | 123456 | [email protected] |
2 | xiaozhang | 123456 | [email protected] |
tbl_address
id | city | country | user_id |
1 | beijing | china | 1 |
2 | shanghai | china | 2 |
这个时候需要输出以下命令
ALTER TABLE jsp_db.`tbl_address` ENGINE = INNODB;
ALTER TABLE jsp_db.`tbl_user` ENGINE = INNODB;
java代码段:
package com.aries4u.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /** * Created by Liukaibo on 2016/3/16. */ public class TransactionTest { public static Connection getConnection() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp_db", "root", "mysqlroot"); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return conn; } public static void insertUserData(Connection conn) throws SQLException { String sql = "INSERT INTO tbl_user(id, name, password, email)" + "VALUES(10, 'TOM', '123456', '[email protected]')"; Statement st = null; int count = 0; st = conn.createStatement(); count = st.executeUpdate(sql); System.out.println("向用户表插入了" + count + "条记录"); } public static void insertAddressData(Connection conn) throws SQLException { String sql = "INSERT INTO tbl_address(id, city, country, user_id)" + "VALUES(1, 'SHANGhai', 'china', '10')"; Statement st = null; int count = 0; st = conn.createStatement(); count = st.executeUpdate(sql); System.out.println("向地址表插入了" + count + "条记录"); } public static void main(String[] args) throws SQLException { Connection conn = null; try { conn = getConnection(); conn.setAutoCommit(false); // 只有设置成false的时候InnoDB才有效 insertUserData(conn); insertAddressData(conn); conn.commit(); } catch (SQLException e) { System.out.println("===========捕获到SQL异常==============="); e.printStackTrace(); if (conn != null) { conn.rollback(); System.out.println("===========事务回滚成功==============="); } } finally { if (conn != null) { conn.close(); } } } }