MySQL引擎

MySQL最常用的存储引擎为:myisam和innodb.
全文索引:目前5.5以上版本myisam和innodb都已经支持。


一、什么是myisam引擎?
    myisam引擎是MySQL关系型数据库管理系统的默认存储引擎(MySQL5.5以前)。这种MySQL表存储机构从旧的ISAM代码扩展出许多有用的功能。在新版本的MySQL中,innodb引擎由于其对事物参照完整性,以及更高的并发性等优点开始逐步取代myisam.
    
    
    每一个myisam表都对应硬盘上的三个文件。这三个文件有一样的文件名,但是有不同的扩展名指示其类型用途:
    .frm:保存表的定义,这个文件并不是myisam引擎的一部分,而是服务器的一部分;
    .MYD:保存表的数据;
    .MYI:是表的索引文件。
        .MYD和.MYI是myisam的关键点。
        
        
二、MyISAM引擎特点
    1、不支持事务。
    2、表级锁(更新时锁整个表):其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
    3、读写互相阻塞:不仅会在写入的时候阻塞,MyISAM还会在读取的时候阻塞写入,但都成本并不会阻塞另外的读。
    4、只会缓存索引:MyISAM可以通过key_buffer_size缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
    5、读取速度快;占用资源少。
    6、不支持外键约束,但支持全文索引。(外键简单说就相当于联表查询,不同表里有相同的字段)
    
    
    
三、MyISAM引擎适用的生产业务场景
    1、不需要事务支持的业务(例如转账,充值付款就不行)。
    2、并发相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)。
    3、数据修改相对较少的业务(阻塞问题)。
    4、以读为主的业务,例如:www.blog.
    5、对数据一致性要求不高的业务。(事务机制)
    6、硬件资源较差。
    7、中小型网站部分业务会用。
    小结:对数据库单一的操作都可以使用MyISAM,所谓单一就是尽量纯读或纯写(insert,update,delete)等。
    
    
    
四、MyISAM引擎调优精要
    1、设置合适的索引(缓存机制)。
    2、调整读写优先级,根据实际需求确保重要操作更优先执行。
    3、启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次写入)。
    4、尽量顺序操作让insert数据都写入到尾部,减少阻塞。
    5、分解打的时间长大的操作,降低单个操作的阻塞时间。
    6、降低并发数(减少对MySQL访问),某些高并发场景通过应用进行排队队列机制MQ消息队列。
    7、对于相对静态(更改不频繁)的数据库数据,充分利用query cache(查询缓存)或memcached缓存服务可以极大的提高访问效率。
    8、MyISAM的count只有在全表扫描的时候特别高效,带有其它条件的count都需要进行实际的数据访问。
        [root@node1 ~]# mysql -e "select count(*) from dept_db.admin"
        +----------+
        | count(*) |
        +----------+
        |       15 |
        +----------+

    9、可以把主从同步的主库使用innodb,从库使用myisam(不推荐).
    
    


    

InnoDB引擎

什么是InnoDB引擎?
    InnoDB引擎是MySQL数据库的另一个重要的存储引擎,正成为目前MySQL AB所发行新版的标准,被包含在所有的二进制安装包里。和其它的存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务,以及参数完整性(即对外键的支持),MySQL5.5以上的版本默认都使用InnoDB存储引擎。
    
    
共享表空间对应的物理数据文件(默认是共享表空间)
    /data/mysql/下的ibdata1里面存放着InnoDB引擎的数据。
    
    

    
    
一、InnoDB引擎特点
    1、支持事务;支持4个事务隔离级别;
    2、行级锁定;(更新时一般是锁定当前行):
    3、读写阻塞与事务隔离级别相关;
    4、具有非常高的缓存特性:能缓存索引,也能缓存数据;
    5、整个表和主键以cluster方式存储,组成一颗平衡树;
    6、所有secondary index都会保存主键信息;
    7、支持分区,表空间,类似Oracle数据库;
    8、支持外键约束,5.5版本以后还支持了全文索引。
    
    
    
二、InnoDB引擎适用的生产业务场景
    1、需要事务支持;
    2、行级锁定对高并发有很好的适应能力,但需要确保查询必须是通过索引完成。
    3、数据读写及更新较为频繁;如:BBS,SNS,微博,微信等。
    4、数据一致性要求较高的业务;如:充值转账等。
    5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能较少磁盘IO.
    6、相比Myisam引擎,Innodb引擎更消耗资源,速度没有Myisam引擎快。
    
    
    
    
三、InnoDB引擎调优精要
    1、主键尽可能小,避免给secondary index带来过大的空间负担;
    2、避免全表扫描,因为会使用表锁。
    3、尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗;
    4、在大批量小插入的时候,尽量自己控制事务而不要使用auto commit自动提交。有开关可以控制提交方式;
    5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性;当设置为0,该模式速度最快,但不太安全;设置为1时正好相反。
        (如果innodb_flush_log_at_trx_commit的值为0,每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;)
    6、避免主键更新,因为这会带来大量的数据移动。
    
    
    
    
四、InnoDB引擎重要参数
    innodb_buffer_pool_size
    
    这个参数主要作用是缓存innodb表的索引,数据,插入数据时的缓冲
    默认值:128M
    专用mysql服务器设置的大小: 操作系统内存的70%-80%最佳。
    设置方法:
    my.cnf文件
    innodb_buffer_pool_size = 6G
    此外,这个参数是非动态的,要修改这个值,需要重启mysqld服务。
    所以设置的时候要非常谨慎。
    并不是设置的越大越好。设置的过大,会导致system的swap空间被占用,导致操作系统变慢,从而减低sql查询的效率。
    
    
    
五、InnoDB参数详细描述文件(my-innodb-heavy-4G.cnf)
    [root@node1 support-files]# pwd
    /usr/local/mysql/support-files
    [root@node1 support-files]# vim my-innodb-heavy-4G.cnf
    
    
    
    
六、生产环境中批量更改MySQL引擎(只能修改表,不能修改库)
    1、单表修改
        alter table table_name engine=innodb;  
        alter table table_name engine=myisam;  
        
    2、使用sed对备份内容进行引擎转换(如果数据量大会需要较多时间)
        mysqldump > dept_db.sql
        sed -e 's/MyISAM/InnoDB/g' dept_db_bak.sql > dept_db.sql
        mysql < dept_db.sql
        
    3、使用命令mysql_convert_table_format
        yum install perl-DBI perl-DBD-MySQL -y(先安装这个)
        mysql_convert_table_format --user=root --password=123456 --socket=/tmp/mysql.sock --engine=myisam dept_db admin(将dept_db库admin表修改为myisam引擎)
        mysql_convert_table_format --user=root --password=123456 --socket=/tmp/mysql.sock --engine=myisam dept_db(修改dept_db库下所有表的引擎)
        
        脚本的方式修改(试过没成功)
        #!/bin/sh
        #
        # Created by david yeung.
        #
        # To convert a table engine.
        #
        cd /usr/local/mysql/bin
        echo 'Enter Host Name:'
        read HOSTNAME
        echo 'Enter User Name:'
        read USERNAME
        echo 'Enter Password:'
        read PASSWD
        echo 'Enter Socket Path:'
        read SOCKETPATH
        echo 'Enter Database Name:'
        read DBNAME
        echo 'Enter Table Name:'
        read TBNAME                    (如果要修改全库的表这里就不用写)
        echo 'Enter Table Engine:'
        read TBTYPE
        ./mysql_convert_table_format --host=$HOSTNAME --user=$USERNAME --password=$PASSWD --socket=$SOCKETPATH --type=$TBTYPE $DBNAME $TBNAME
    
    
        查看数据库所有表的engine:
        [root@node1 ~]# mysql -e "SELECT table_name, table_type, engine FROM information_schema.tables WHERE table_schema = 'dept_db' ORDER BY table_name DESC;"
        [root@node1 ~]# mysql -e "show table status from dept_db"

 

 

你可能感兴趣的:(engine,数据库)