我正在研究涉及大量数据库写入的项目,我会说(70%的插入和30%的读取).该比率还包括我认为是一次读取和一次写入的更新.读取可能很脏(例如,在读取时我不需要100%准确的信息).
有问题的任务将是每小时进行超过100万次数据库事务.
我在网上看到了一些关于MyISAM和InnoDB之间差异的东西,对于我将用于此任务的特定数据库/表格来说,MyISAM似乎是我的明显选择.从我似乎正在阅读的内容来看,如果需要事务处理,InnoDB很好,因为支持行级锁定.
有没有人有这种负载(或更高)的经验?MyISAM是走的路吗?
我有一个很大但很窄的InnoDB表,记录大约9米.在桌子上count(*)或count(id)桌子上做的非常慢(6秒以上):
DROP TABLE IF EXISTS `perf2`;
CREATE TABLE `perf2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`channel_id` int(11) DEFAULT NULL,
`timestamp` bigint(20) NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ts_uniq` (`channel_id`,`timestamp`),
KEY `IDX_CHANNEL_ID` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
RESET QUERY CACHE;
SELECT COUNT(*) FROM perf2;
Run Code Online (Sandbox Code Playgroud)
虽然声明不经常运行,但优化它会很好.根据http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/,这可以通过强制InnoDB使用索引来实现:
SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);
Run Code Online (Sandbox Code Playgroud)
解释计划似乎很好:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE perf2 index NULL PRIMARY 4 …Run Code Online (Sandbox Code Playgroud) 对于具有相同where子句的查询,我发现select count(*)比select*花费的时间要长得多.
该表有大约220万条记录(称之为详细信息表).它有一个链接到另一个表(维护)的外键字段.
此查询大约需要10-15秒:
select count(*) from detailtable where maintableid = 999
Run Code Online (Sandbox Code Playgroud)
但这需要一秒钟或更短时间:
select * from detailtable where maintableid = 999
Run Code Online (Sandbox Code Playgroud)
更新 - 有人要求指明所涉及的记录数量.这是150.
更新2以下是使用EXPLAIN关键字时的信息.
对于SELECT COUNT(*),EXTRA列报告:
Using where; Using index
Run Code Online (Sandbox Code Playgroud)
KEY和POSSIBLE KEYS都有外键约束作为它们的值.
对于SELECT*查询,除了EXTRA之外,一切都是相同的:
Using Where
Run Code Online (Sandbox Code Playgroud)
更新3尝试OPTIMIZE TABLE,它仍然没有什么区别.