码迷,mamicode.com
首页 > 数据库 > 详细

(DBA之路【二】)mysql 主流存储引擎的特点

时间:2015-06-08 21:43:15      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:foreign   服务器   数据安全   空间   mysql   

innoDB存储引擎:

如果应用中需要执行大量的INSERTUPDATE操作,则应该使用InnoDB。

优点:(1 innodb存储引擎该mysql表提供了事务(事务有原子性以及一致性,这样保障数据安全,全步对才对),回滚以及系统崩溃修复能力(断电或者异常前能够自动保存数据)和多版本迸发控制的事务的安全。大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复,INNODB通过事务日志来恢复数据。

2innodb存储引擎支持外键(foreign key)这个很好用,表可以级连。

3innodb存储引擎最重要的是支持事务,以及事务相关联功能。

4innodb存储引擎支持mvcc的行级锁,以及进行mysqldump进行数据备份时可以不占用缓存区。

 5InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在 分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。


------------------------简单的锁介绍--------------------------------------------------------

读锁:

也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对AS锁,而不能加X锁,直到T释放A上的锁。这保证了其他事务可以读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存储引擎:

1MyISAM  这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁,支持全文索引,主要用于高负载的select

2myisam类型的表支持三种不同的存储结构:静态型、动态型、压缩型。

1)静态型:就是定义的表列的大小是固定(即不含有:xblobxtextvarchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式。

        使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开销很低。但是这高性能是有空间换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。

2)动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时myisam就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据变化的怎多,碎片就会增加,数据访问性能就会相应的降低。

      对于因为碎片的原因而降低数据访问性,有两种解决办法:

     @1、尽可能使用静态数据类型

     @2、经常使用optimize   table语句,他会整理表的碎片,恢复由于表的更新和删除导致的空间丢失。

        (如果存储引擎不支持 optimize  table    则可以转储并重新加载数据,这样也可以减少碎片)

3)压缩型:如果在这个数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压缩型表来减少空间的占用。

3每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。 数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)




MEMORY存储引擎:

1memory存储引擎相比前面的一些存储引擎,有点不一样,其使用存储在内从中的数据来创建表,而且所有的数据也都存储在内存中。

2)每个基于memory存储引擎的表实际对应一个磁盘文件,该文件的文件名和表名是相同的,类型为.frm。该文件只存储表的结构,而其数据文件,都是存储在内存中,这样有利于对数据的快速处理,提高整个表的处理能力。

3memory存储引擎默认使用哈希(HASH)索引,其速度比使用B-+Tree型要快,如果读者希望使用B树型,则在创建的时候可以引用。

4memory存储引擎文件数据都存储在内存中,如果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‘


各存储引擎相互转化:

1alter  table  tablename  engine = INnodb /MyISAM/Memory    //       修改了这个表的存储引擎

优点:简单,而且适合所有的引擎。

缺点:(1)、这种转化方式需要大量的时间 I/Omysql要执行从旧表 到新表的一行一行的复制所以效率比较低

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表中,可以和其他字段一起建立联合索引。

      4DELETE 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”来设置达到好的性能。




(DBA之路【二】)mysql 主流存储引擎的特点

标签:foreign   服务器   数据安全   空间   mysql   

原文地址:http://10170308.blog.51cto.com/10160308/1659833

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!