InnoDB相关

最近要用到表事务中的一些回滚处理,所以看了一下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 email
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


如果发现Engine不是InnoDB,是无法执行事务的.

这个时候需要输出以下命令

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();
            }
        }
    }
}

你可能感兴趣的:(java,数据库,mysql,事务,InnoDB)