Innodb vs MYISAM

栏目: 数据库 · 发布时间: 6年前

内容简介:世界杯什么的开幕式么……一封邮件飞了过来还是处理一下邮件吧!

世界杯什么的开幕式么……

一封邮件飞了过来

2018-06-15 00:07:26,479 [ERROR] [startQuertz_Worker-3] o.q.c.JobRunShell:211 Job DEFAULT.validateOrderTask threw an unhandled Exception:
org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'validateOrder' on target class [class com.air.tqb.quarz.F6MonitorJob] failed; nested exception is org.springframework.jdbc.UncategorizedSQLException:
### Error updating database.  Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: CREATE TABLE tm_monitor_order_20180615 (             `pk_id` int(11) NOT NULL COMMENT '主键id',             `storage_id` int(11) NOT NULL COMMENT '仓库id',             `part_id` int(11) NOT NULL COMMENT '材料id',             `order_no` varchar(25) NOT NULL COMMENT '批次单号',             `number` decimal(18,2) NOT NULL COMMENT '库存数',             `avg_price` decimal(18,6) NOT NULL COMMENT '含税价格',             `avg_price_no_tax` decimal(18,6) NOT NULL COMMENT '除税价格',             `supplier_id` bigint(20) unsigned DEFAULT NULL COMMENT '供应商id',             `creator` bigint(20) unsigned NOT NULL COMMENT '创建人',             `creationtime` datetime NOT NULL COMMENT '创建日期(库龄)',             `modifiedtime` timestamp NULL DEFAULT NULL COMMENT '修改时间',             `modifier` bigint(20) unsigned DEFAULT NULL COMMENT '修改人',             `id_own_org` bigint(20) unsigned NOT NULL COMMENT '对应门店id',             `id_source_bill` bigint(20) unsigned DEFAULT NULL COMMENT '来源单ID',             `version` bigint(20) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',         PRIMARY KEY (`pk_id`),         KEY `IDX_PART_ID` (`part_id`),         KEY `IDX_ORG` (`id_own_org`),         KEY `IDX_STORAGE_ID` (`storage_id`)         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='批次主表备份';         INSERT INTO tm_monitor_order_20180615         (pk_id, storage_id, part_id, order_no, number, avg_price, avg_price_no_tax, supplier_id, creator, creationtime, modifiedtime, modifier, id_own_org, id_source_bill, version)             SELECT                 pk_id,                 storage_id,                 part_id,                 order_no,                 number,                 avg_price,                 avg_price_no_tax,                 supplier_id,                 creator,                 creationtime,                 modifiedtime,                 modifier,                 id_own_org,                 id_source_bill,                 version             FROM ts_storage_partinfo_order
### Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; Statement cancelled due to timeout or client request; nested exception is com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
at

还是处理一下邮件吧!

分析

创建该表的目的是用来监控期末期初数据 也可以作为部分报表的输入

那么该表插入需要超时花了多少时间呢???

<updateid="createOrderMonitorTable"timeout="600">
    CREATE TABLE tm_monitor_order_${suffix} (
        `pk_id` int(11) NOT NULL COMMENT '主键id',
        `storage_id` int(11) NOT NULL COMMENT '仓库id',
        `part_id` int(11) NOT NULL COMMENT '材料id',
        `order_no` varchar(25) NOT NULL COMMENT '批次单号',
        `number` decimal(18,2) NOT NULL COMMENT '库存数',
        `avg_price` decimal(18,6) NOT NULL COMMENT '含税价格',
        `avg_price_no_tax` decimal(18,6) NOT NULL COMMENT '除税价格',
        `supplier_id` bigint(20) unsigned DEFAULT NULL COMMENT '供应商id',
        `creator` bigint(20) unsigned NOT NULL COMMENT '创建人',
        `creationtime` datetime NOT NULL COMMENT '创建日期(库龄)',
        `modifiedtime` timestamp NULL DEFAULT NULL COMMENT '修改时间',
        `modifier` bigint(20) unsigned DEFAULT NULL COMMENT '修改人',
        `id_own_org` bigint(20) unsigned NOT NULL COMMENT '对应门店id',
        `id_source_bill` bigint(20) unsigned DEFAULT NULL COMMENT '来源单ID',
        `version` bigint(20) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',
    PRIMARY KEY (`pk_id`),
    KEY `IDX_PART_ID` (`part_id`),
    KEY `IDX_ORG` (`id_own_org`),
    KEY `IDX_STORAGE_ID` (`storage_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='批次主表备份';
    INSERT INTO tm_monitor_order_${suffix}
    (pk_id, storage_id, part_id, order_no, number, avg_price, avg_price_no_tax, supplier_id, creator, creationtime, modifiedtime, modifier, id_own_org, id_source_bill, version)
        SELECT
            pk_id,
            storage_id,
            part_id,
            order_no,
            number,
            avg_price,
            avg_price_no_tax,
            supplier_id,
            creator,
            creationtime,
            modifiedtime,
            modifier,
            id_own_org,
            id_source_bill,
            version
        FROM ts_storage_partinfo_order
</update>

小伙伴用了600s都没能正确的产生 发生了事务回滚【要记得创建表等ddl无法回滚】

那么此时将产生一个表【但是数据为空】

再屡屡我们的需求:

我们对于该表的定位基本一次插入永不更新~【纯查询】

那么是否有必要使用innodb呢?

I have a table with 17 million rows. I need to grab 1 column of that table and insert it all into another table. Here’s what I did:

INSERT IGNORE INTO table1(name) SELECT name FROM main WHERE ID < 500001

InnoDB executes in around 3 minutes and 45 seconds

However, MyISAM executes in just below 4 seconds. Why the difference?

I see everyone praising InnoDB but honestly I don’t see how it’s better for me. It’s so much slower. I understand that it’s great for integrity and whatnot, but many of my tables will not be updated (just read). Should I even bother with InnoDB?

有人问了如上问题 其实innodb具有事务 那么必然需要大量的redolog来保证 同时为了维持较好的性能 innodb会使用较多的内存来缓存对应的数据【其消耗更多的磁盘空间】

MyISAM is designed with the idea that your database is queried far more than its updated and as a result it performs very fast read operations. If your read to write(insert|update) ratio is less than 15% its better to use MyISAM.InnoDB uses row level locking, has commit, rollback, and crash-recovery capabilities to protect user data. It supports transaction and fault tolerance

那么我们可以简单认为oltp应用使用innodb更合适 而olap应用使用myisam更加合适【或许还有其他适合压缩型】

对于上述不会更新的表 我重建了之后如下

Innodb vs MYISAM

同时我们比较一下表占用的大小

比如

Innodb vs MYISAM

但是前一天备份大小如下

Innodb vs MYISAM

似乎更小嘛【innodb】===》不过没有数据噢(侧面说明了rows不准确)不过从733M缩小到了590M 同时时间减少了如此多【超过600s===》17s】

方案

考虑在创建表的时候使用如下

ENGINE = MyISAM

同时注意合理使用校验集~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Algorithms for Programmers

Practical Algorithms for Programmers

Andrew Binstock、John Rex / Addison-Wesley Professional / 1995-06-29 / USD 39.99

Most algorithm books today are either academic textbooks or rehashes of the same tired set of algorithms. Practical Algorithms for Programmers is the first book to give complete code implementations o......一起来看看 《Practical Algorithms for Programmers》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具