• mysql引擎和事务


    对于应用程序和用户来说,同样一张表的数据无论用什么引擎来存储,看到的数据都是一样的,只是不同的引擎在功能、占用空间大小、读取性能等方面可能有所差别。

    mysql最常用的存储引擎为Innodb、MyISAM和全文索引

    5.5.5以前默认存储引擎为MyISAM,5.5.5及之后默认存储引擎为Innodb

    mysql> show engines G查看当前数据库系统支持的引擎

    mysql5.5支持事务的引擎:Innodb/ndb(集群的引擎)

    对于MyISAM来说,每一个表对应于磁盘上的三个文件,这三个文件名称相同,扩展名不同。

    .frm文件保存表的定义(是服务器而不是MyISAM引擎的一部分),.MYD保存表的数据,.MYI是表的索引文件(可参考mysql的系统库mysql下的文件)

    特点:

    1.不支持事务

    2.表级锁定(更新时锁定整个表),锁定的成本小,但大大降低了并发性能

    3.读写互相阻塞,不仅会在写入的时候阻塞读取,还会在读取的时候阻塞写入,但是读不会阻塞另外的读

    4.只会缓存索引不能缓冲数据,可以通过key_buffer_size缓存索引,减少磁盘IO,但是只会缓存索引不会缓存数据

    5.读取速度较快,占用资源相对少(功能相对弱,锁的粒度大)

    6.不支持外键约束,但支持全文索引

    7.mysql5.5.5默认的存储引擎

    适用的生产场景:单一对数据库的操作(纯读或者纯写)可以使用

    1.不需要事务支持的业务(例如转账、充值就不行)

    2.一般为读多或者写多的网站应用,读写都频繁的场景不适合

    3.读写并发相对较低的业务(纯读纯写高并发也可以)

    4.数据修改相对较少的业务

    5.以读为主的业务,例如www、blog、图片信息数据库

    6.对数据一致性要求不很高的业务

    7.硬件资源相对较差的机器

    调优精要:

    1.设置合适的索引

    2.调整读写优先级,根据实际需要确保重要的操作更优先执行

    3.启用延迟插入改善大批量写入性能(降低写入频率)

    4.尽量顺序操作,让insert数据都写入到尾部,减少阻塞

    5.分解大的时间长的操作,降低单个操作的阻塞时间

    6.降低并发数,某些高并发场景通过应用进行排队队列机制

    7.对于相对静态(更改不频繁)的数据库数据,充分利用query cache或者mamcached缓存服务极大的提高访问效率

    8.count只有在全表扫描的时候高效,带有其他条件的count都需要进行实际的数据访问

    9.可以把主从同步的主库使用Innodb,从库使用MyISAM引擎(不推荐)

    Innodb

    特点:

    1.支持事务

    2.行级锁定(更新时一般锁定当前行),通过索引实现,如果进行全表扫描仍然会锁全表与MyISAM相同,注意间隙锁的影响

    3.读写阻塞与事务隔离级别相关

    4.具有高效的缓存特性,能缓存索引,也能缓存数据

    5.整个表和主键以cluster方式存储,组成一棵平衡树

    6.所有secondary index都会保存逐渐信息

    7.支持分区和表空间,类似oracle数据库

    8.支持外键约束,5.5以前不支持全文索引,后续支持

    9.与MyISAM相比对硬件资源要求相对较高

    适用场景:

    1.需要事务支持的业务

    2.行级锁定对高并发有很好的适应能力,但需要确保查询通过索引完成

    3.数据读写及更新都较为频繁的场景,如bbs、sns、微博、微信等

    4.对数据一致性要求较高的业务,例如充值转账

    5.硬件设备内存大,可以利用Innodb较好的缓存能力来提高内存利用率,尽可能减少磁盘IO

    6.与MyISAM引擎相比,Innodb引擎更消耗资源,速度没有MyISAM快

    调优精要:

    1.主键尽可能小,避免给secondary index带来过大压力

    2.避免全表扫描,否则会使用表锁

    3.尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗

    4.在大批量小插入的时候,尽量自己控制事务,而不要使用autocommit

    4.合理设置innodb_flush_log_at_trx_commit,不要过度追求安全性

    5.避免主键更新,这会带来大量的数据移动

    事务:逻辑上的一组sql语句操作,这组sql语句执行时要么全部成功要么全部失败

    事务的四大特性ACID

    原子性(atomicity):事务是一个不可分割的单位,一个事务中的所有sql操作要么全部成功要么全部失败

    一致性(consistency):事务发生前和发生后,事务的完整性必须保持一致

    隔离性(isolation):当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他会话是不可见的,多个并发事务之间的数据是互相隔离的(mysqldump时的参数--single-transaction)

    持久性(durability):一个事务一旦被提交,它对数据库中的数据改变就是永久性的,如果出了错误,事务不允许撤销,只能通过“补偿性事务”

    mysql数据库的事务默认是自动提交的。如果想多条sql在一个事务中执行,则需要使用事务进行处理。如果开启一个事务没有提交,mysql会自动回滚事务,或者手动使用rollback回滚。

    start transaction开启事务

    rollback回滚事务

    commit提交事务

    mysql> show variables like '%commit%';结果为on或者off(默认为on)

    表创建后修改引擎的方法

    1.mysql语句修改

    mysql> alter table test2 engine=MyISAM;

    2.使用sed对备份内容进行引擎替换,即用mysqldump备份,使用sed对引擎做替换,再导入替换后的备份语句

    3.linux命令mysql_convert_table_format修改

  • 相关阅读:
    深入了解CSS字体度量,行高和vertical-align
    解决ios手机上传竖拍照片旋转90度问题
    HTML5图片上传本地预览
    前端本地文件操作与上传
    前端基础进阶(一):内存空间详细图解
    js小知识-数组去重
    SQL Server物化视图学习笔记
    MindMaster学习笔记
    c#Lock学习笔记
    oauth2.0学习笔记(摘抄简化)
  • 原文地址:https://www.cnblogs.com/Forever77/p/10051278.html
Copyright © 2020-2023  润新知