说明: 我知道这真的取决于很多因素。但是我对MySQL很担心,因为一些计时行为对我来说似乎不正常,我怀疑我做错了什么。
这是表格:
CREATE TABLE `tmp_set_pumac` (
`count` int(11) DEFAULT NULL,
`_pc_avg` float NOT NULL,
`_pc_min` int(11) NOT NULL,
`_pc_max` int(11) NOT NULL,
`tm` int(11) NOT NULL,
`sx` int(11) NOT NULL,
`ag` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `tmp_set_pumac`
ADD PRIMARY KEY (`tm`,`sx`,`ag`);
很简单,使用组合的主键。
我正在对其进行中等复杂度检索查询,例如:
SELECT SUM(`count`) AS `count`, AVG(`_pc_avg`) AS `_pc_avg`, MIN(`_pc_min`) AS `_pc_min`, MAX(`_pc_max`) AS `_pc_max`, (floor((`tm`-0)/200)*200+0) AS `tm`, `sx`, `ag`
FROM tmp_set_pumac
WHERE (`_pc_avg` BETWEEN 10 AND 14) AND (`_pc_min` BETWEEN 10 AND 14) AND (`_pc_max` BETWEEN 10 AND 14) AND (`sx` BETWEEN 0 AND 2)
GROUP BY floor((`tm`-0)/200)*200+0, `sx`, `ag`
以及中等复杂度的插入查询,例如:
INSERT INTO tmp_set_pumac (`count`, `tm`, `sx`, `ag`, `_pc_avg`, `_pc_min`, `_pc_max`) VALUES (1, 12205, 2, 6, 10, 10, 10)
ON DUPLICATE KEY UPDATE `count`=`count`+1, `_pc_avg`=((`_pc_avg`*`count`)+ 10) / (`count`+1), `_pc_min`=IF(`_pc_min`<10,`_pc_min`,10), `_pc_max`=IF(`_pc_max`>10,`_pc_max`,10)
问题: 我用Xdebug分析我的PHP - 并与MySQLi连接。检索查询(第二个SQL代码)需要4毫秒才能执行(它会在服务器上完成所有agregarion时检索较少的行数)。 但是Inser Query(第三个SQL代码)需要花费90ms才能执行。现在,好吧,UPDATE代码执行起来可能看起来很复杂,但只会在IF新行中执行一次,与现有行冲突(即将与索引一起找到)。那么这种执行差异怎么可能呢?
在你问之前。我试过用&amp;主键字段上没有索引。