innoDB存储引擎:
如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB。
优点:(1) innodb存储引擎该mysql表提供了事务(事务有原子性以及一致性,这样保障数据安全,全步对才对),回滚以及系统崩溃修复能力(断电或者异常前能够自动保存数据)和多版本迸发控制的事务的安全。大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复,INNODB通过事务日志来恢复数据。
(2)innodb存储引擎支持外键(foreign key)这个很好用,表可以级连。
(3)innodb存储引擎最重要的是支持事务,以及事务相关联功能。
(4)innodb存储引擎支持mvcc的行级锁,以及进行mysqldump进行数据备份时可以不占用缓存区。
(5)InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在 分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
------------------------简单的锁介绍--------------------------------------------------------
读锁:
也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
写锁:
又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。
表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。
行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。
--------------------------------------------------------------------------------------------
MyISAM存储引擎:
1、MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁,支持全文索引,主要用于高负载的select。
2、myisam类型的表支持三种不同的存储结构:静态型、动态型、压缩型。
(1)静态型:就是定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式。
使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开销很低。但是这高性能是有空间换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。
(2)动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时myisam就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据变化的怎多,碎片就会增加,数据访问性能就会相应的降低。
对于因为碎片的原因而降低数据访问性,有两种解决办法:
@1、尽可能使用静态数据类型
@2、经常使用optimize table语句,他会整理表的碎片,恢复由于表的更新和删除导致的空间丢失。
(如果存储引擎不支持 optimize table 则可以转储并重新加载数据,这样也可以减少碎片)
(3)压缩型:如果在这个数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压缩型表来减少空间的占用。
3、每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)
MEMORY存储引擎:
(1)memory存储引擎相比前面的一些存储引擎,有点不一样,其使用存储在内从中的数据来创建表,而且所有的数据也都存储在内存中。
(2)每个基于memory存储引擎的表实际对应一个磁盘文件,该文件的文件名和表名是相同的,类型为.frm。该文件只存储表的结构,而其数据文件,都是存储在内存中,这样有利于对数据的快速处理,提高整个表的处理能力。
(3)memory存储引擎默认使用哈希(HASH)索引,其速度比使用B-+Tree型要快,如果读者希望使用B树型,则在创建的时候可以引用。
(4)memory存储引擎文件数据都存储在内存中,如果mysqld进程发生异常,重启或关闭机器这些数据都会消失。所以memory存储引擎中的表的生命周期很短,一般只使用一次。
关于存储引擎的指令:
(1)查看表的存储类型(三种):
・ show create table tablename
・ show table status from dbname where name=tablename
・ mysqlshow -u user -p password--status dbname tablename
(2)修改表的存储引擎:
・ alter table tablename type=InnoDB
(3)启动mysql数据库的命令行中添加以下参数使新发布的表都默认使用事务:
・ --default-table-type=InnoDB
(4)临时改变默认表类型:
・ set table_type=InnoDB
・ show variables like 'table_type'
各存储引擎相互转化:
1、alter table tablename engine = INnodb /MyISAM/Memory // 修改了这个表的存储引擎
优点:简单,而且适合所有的引擎。
缺点:(1)、这种转化方式需要大量的时间 和I/O,mysql要执行从旧表 到新表的一行一行的复制所以效率比较低
(2)、在转化这期间源表加了读锁
(3)、从一种引擎到另一种引擎做表转化,所有属于原始引擎的专用特性都会丢失,比如从innodb到 myisam 则 innodb的索引会丢失!
2、使用dump(转储) import(导入)
优点:使用mysqldump这个工具将修改的数据导出后会以.sql 的文件保存,你可以对这个文件进行操作,所以你有更多更好的控制, 如修改表名,修改存储引擎等
INNODB与MYISAM不同:
1)InnoDB 的表需要更多的内存和存储。MyISAM支持全文类型索引,而InnoDB不支持全文索引。且MyISAM锁的粒度是表级,而InnoDB支持行级锁定
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%”
6)MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
7)InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)
提升InnoDB性能的方法:
MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同 样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。
。