特点:支持事务。锁定机制的改进,Innodb改变了MylSAM的锁机制,实现了行锁。实现外键。.frm文件来存放结构定义相关的元数据,但是表数据和索引数据是存在一起的,每个表单独存放还是表存放在一起,完全由用户来决定。

理论:Innodb的物理结构分为两大部分

        数据文件(表数据和索引数据)

            存放表中的数据和所有的索引数据,包括主键和其他普通索引。Innodb中,存在了表空间这样的概念,和oracle的表空间又有较大的不同。Innodb的表空间分为两种形式。一种是共享表空间,就是所有表和索引数据存放在同一个表空间中,通过Innodb_data_file_path来指定,增加数据文件需要停机重启。独享表空间就是每个表的数据和索引被存放在一个单独的.idb文件中。虽然可以自行设定使用共享表空间还是独享表空间来存放我们的表,但是共享表空间必须存在,Innodb的undo信息和其他一些元数据信息都是存放在共享表空间里的。共享表空间的数据文件可以设置为固定大小和可自动扩展大小。

            当文件表空间用完时,必须为其增加数据文件,只有共享表空间可以增加数据文件。操作就是在Innodb_data_file_path参数都没安装标准格式设置好文件路径和相关属性即可。Innodb在创建新数据文件时是不会创建目录的,指定目录不存在,则会报错。

        日志文件(和oracle的redo日志比较,同样可以设置多个日志组,同样采用轮循策略来顺序写入。

            Innodb是事务的存储引擎,系统carsh对他来说并不能造成严重的损失,由于有redo日志的存在,checkpoint机制的保护,Innodb完全可以通过redo日志将数据库crash时刻已经完成但没有来得及将数据写入磁盘的事务恢复,也能够将所有部分完成并已经写入磁盘的未完成事务回滚并将数据还原。

            Innodb在功能特性方面和MylSAM存储引擎有较大的区别,在配置上面也是单独处理的。在mysql启动参数文件设置中,Innodb的所有参数基本上都带有前缀innodb_,和所有Innodb相关的系统变量一样,所有的innodb相关的系统状态值也同样全部以innodb_前缀。

    MylSAM和Innodb区别

            MylSAM不支持事务,而Innodb支持。Innodb的autocammit默认是打开的,即每条sql语句都会默认被封装成一个事务,自动提交,会影响速度,所以最好把多余的sql语句显示放在begin和commit之间,组成一个事务提交。

            查看Innodb的事务是否打开:show variables like '%autocommit%';

            Innodb至此数据行锁定,MylSAM不支持,只支持锁定整个表。即MylSAM同一个表上的读锁和写锁是互斥的,MylSAM并发读写是如果等待队列中既有读请求又有写请求,默认写请求的优先级高,集使独请求先到,所以MyLSAM不适合于有大量查询和修改并存的情况,查询进程会长时间阻塞,因为MylSAM是锁表。

            Innodb支持外键,MylSAM不支持

            Innodb不支持全文索引,而MylSAM支持

    Mysqlslap性能测试MySQL两种存储引擎

        Mysqlslays是mysql自带的基准测试工具,优点:查询数据,语法简单,灵活容易使用,可以模拟多个客户端同时并发的想服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的新学年比较.mysqlslay为mysql性能优化前后提供了直观的验证依据。

            压力测试工具mysqlslap,关于选项手册以及--help介绍:

                --concurrency代表并发数量,多个可以用逗号隔开。

                --engines代表要测试的引擎,可以多个,用分隔符隔开

                --itertions代表运行这些测试多少次,集运行多少次后,得到结果。

                --auto-generate-sql代表用系统自己生成SQL脚本来测试

                --auto-generate-sql-load-type测试的是读还是写还是两者混合

                --number-of-queries代表总共要运行多少次查询,每个客户运行的查询数量可以用查询总数并发数来计算。

                --debug-info代表额外输出CPU以及内存的相关信息

                --number-int-cols代表测试表中的INTEGER类型的属性有几个

                --create-schema代表自己定义的模式(在mysql总也就是库即创建测试的数据库)

                --query代表自己的sql脚本

                --only-print如果只想打印sql语句是什么,可以用这个选项

                --csv=name生产CSV格式数据文件

                    查看数据库默认最大连接数:show variables like '%max_connections%';

                    不同版本默认最大连接不差别。一般生成环境下添加max_connectoins=1024

                    查看mysql默认使用存储引擎:show engines;

                    用自带的sql脚本来测试:mysqlslap --default-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=20 --number-char-cols=30 --auto-generate-sql --auto-generate-sql-add-autoincerement --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=2000 -uroot- p123455 -verbose    说明:模拟测试两次读写并发,第一次100,第二次200,自动生成sql脚本,测试表包含20个init字段,30个char字段,每次执行2000查询请求,测试引擎分别是myisam,innodb