zoukankan      html  css  js  c++  java
  • 存储优化:MyISAM和Innodb区别

    MySQL中索引是在存储引擎层实现的,常用的有Innodb,MyISAM存储引擎。

    查看你的mysql现在提供什么存储引擎

    Show engines;

    从中可以看出:默认支持的是Innodb,支持事务、行级锁定、外键。

    查看mysql当前默认的存储引擎

    Show variables like “%storage_engine%”;

     

    一、InnoDB存储引擎:(适合高并发

    特点:

    1. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。相比较MyISAM存储引擎,InnoDB写的处理效率差一点并且会占用更多的磁盘空间保留数据和索引

    2. 提供了对数据库事务ACID的支持(原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability),实现了SQL标准的四种隔离级别。

    3. 设计目标就是处理大容量的数据库系统MySQL运行时InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。

    4. 执行“select count(*) from table”语句时需要扫描全表,因为使用innodb引擎的表不会保存表的具体行数,所以需要扫描整个表才能计算多少行。

    5. InnoDB引擎是行锁,粒度更小,所以写操作不会锁定全表,在并发较高时,使用InnoDB会提升效。即存在大量UPDATE/INSERT操作时,效率较高

    6. InnoDB清空数据量大的表时,是非常缓慢,这是因为InnoDB必须处理表中的每一行,根据InnoDB的事务设计原则,首先需要把“删除动作”写入“事务日志”,然后写入实际的表。所以,清空大表的时候,最好直接drop table然后重建。即InnoDB一行一行删除,不会重建表。

    使用场景:

    1. 经常UPDETE/INSERT的表,使用处理多并发的写请求

    2. 支持事务,必选InnoDB

    3. 可以从灾难中恢复(日志+事务回滚)

    4. 支持外键约束、列属性AUTO_INCREMENT

    二、MyISAM存储引擎

    特点:

    1 . MyISAM不支持事务不支持外键SELECT/INSERT为主的应用可以使用该引擎。

    2. 每个MyISAM在存储成3个文件,扩展名分别是:

    1) frm:存储表定义(表结构等信息)

    2) MYD(MYData),存储数据

    3) MYI(MYIndex),存储索引

    3. 不同MyISAM表的索引文件和数据文件可以放置到不同的路径下。

    4. MyISAM类型的表提供修复的工具,可以用CHECK TABLE语句来检查MyISAM表健康,并用REPAIR TABLE语句修复一个损坏的MyISAM表。

    5. 在MySQL5.6以前,只有MyISAM支持Full-text全文索引

    使用场景:

    1. 经常SELECT/INSERT的表,插入不频繁,查询非常频繁

    2. 不支持事务

    3. 做很多count 的计算。

    三、MyISAM和Innodb区别:

    MyISAM类型不支持事务处理,而InnoDB类型支持。MyISAM类型强调的是性能,其执行速度比InnoDB类型更快,而InnoDB提供事务支持支持外等高级数据库功能。

    具体实现的差别:

    1、MyISAM 是非事务安全型的,而InnoDB是事务安全型的

    2、MyISAM 锁的粒度是表级,不适合高并发的操作。而InnoDB支持行级锁定,适合高并发的操作

    3、MyISAM 不支持外键,而InnoDB支持外键

    4、MyISAM只缓存索引,不缓存真实数据。Innodb不仅缓存索引还缓存真实数据,比从表中查找更快

    MyISAM 相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

    InnoDB 表比MyISAM表更安全

    互联网公司用mysql比较多。

    Innodb不仅缓存索引还缓存真实数据,这样就比从表中查数据更快。

     四、存储优化(插入大量数据):

    1、禁用索引

    对于使用索引的表,插入记录时,MySQL会对插入的记录建立索引。如果插入大量数据,建立索引会降低插入数据速度。为了解决这个问题,可以在批量插入数据之前禁用索引数据插入完成后再开启索引

    禁用索引的语句: ALTER TABLE table_name DISABLE KEYS

    开启索引语句: ALTER TABLE table_name ENABLE KEYS

    2、禁用唯一性检查

    唯一性校验会降低插入记录的速度,可以在插入记录之前禁用唯一性检查,插入数据完成后再开启。

    禁用唯一性检查的语句:SET UNIQUE_CHECKS = 0;

    开启唯一性检查的语句:SET UNIQUE_CHECKS =1;

    3、禁用外键检查

    插入数据之前执行禁止对外键的检查,数据插入完成后再恢复,可以提高插入速度。

    禁用:SET foreign_key_checks = 0;

    开启:SET foreign_key_checks = 1;

    4、批量插入数据

    插入数据时,可以使用一条INSERT语句插入一条数据,也可以一条INSERT语句插入多条数据尽量使用多个值表的insert语句,这样可以大大缩短客户机与数据库的连接、关闭等损耗。这比使用分开INSERT语句快(在一些情况中几倍)。

    5、禁止自动提交

    插入数据之前执行禁止事务的自动提交,数据插入完成后再恢复,可以提高插入速度。

    禁用:SET autocommit = 0;

    开启:SET autocommit = 1;

  • 相关阅读:
    【深度学习系列1】 深度学习在腾讯的平台化和应用实践
    js复制button在ie下的解决方式
    兔子--Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK
    UART串口协议基础1
    高校站点群建设方案简单介绍
    oracle10G之前介质下载地址【珍藏版】
    程序猿打新总结 6月份 新股申购秘籍
    斯坦福IOS开发第五课(第一部分)
    O2O领域添新军,正品网加快布局的战略考量
    如风一样,飞翔------Day37
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15314161.html
Copyright © 2011-2022 走看看