【发布时间】:2015-03-09 19:29:26
【问题描述】:
我们有一个具有 8GB RAM 和 PHP5.3 和 MySQL 5.1 的专用服务器
最多有大约 500 个并发连接,每个连接使用用户数据对较小的表执行 1-2 次 SELECT 查询,然后在大表 transactions 中执行 INSERT。选择查询不需要太多,我们在每个查询之间添加了监控以查看每个查询的响应时间,并且从来没有问题。
我们在代码中添加了跟踪功能,有时会导致一些简单的 INSERT 查询需要 14-15 秒。下面列出的这个查询有时需要 14 秒、有时 6 秒、有时 0.2 秒或更短。可能是什么问题?
有时会返回这些巨大延迟的 PHP 代码:
$starT = microtime(true);
echo '×tampTS_02='.(microtime(true) - $startT);
mysqli_query($GLOBALS['con'],"INSERT INTO `transactions` (`id`,`data`) VALUES('id','some_data')") or die(mysqli_error($GLOBALS['con']));
echo '×tampTS_03='.(microtime(true) - $startT);
transactions 表目前有大约 200 万个条目。
CREATE TABLE IF NOT EXISTS `transactions` (
`id` int(11) NOT NULL,
`data` varchar(1000) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
【问题讨论】:
-
MyISAM 不是最好的存储选项,至少测试一下 InnoDB
-
concurrent_insert的值是多少?
-
@Dagon 这个表通常是 InnoDB,因为我们有更多的插入和很少的 SELECT 数据。但问题是因为它是 InnoDB,所以我们切换到 MyISAM 看看它是否表现得更好。当表是 InnoDB 时,我们没有监控每个查询。一旦我们发现问题,你认为它会像 InnoDB 那样表现得更好吗?因为很明显不是来自DB存储类型。
-
@Buddy 我可以使用 phpMyAdmin 或执行任何查询来找到它吗?或者我怎样才能得到“concurrent_insert”的值?
-
另外,5.1 的日期是 2010 年而不是 2013 年。仅仅因为您的主机懒得升级他们的标准版本并不意味着他们做对了。我们在 rackspace 托管服务器上遇到了这种情况,当我问为什么它不是 5.5/5.6 时,他们似乎很惊讶。只是安全性增强使它变得轻而易举,更不用说提高性能了,尤其是 InnoDB