我有一个仓库表格,看起来像这样:
CREATE TABLE Warehouse (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
eventId BIGINT(20) UNSIGNED NOT NULL,
groupId BIGINT(20) NOT NULL,
activityId BIGINT(20) UNSIGNED NOT NULL,
... many more ids,
"txtProperty1" VARCHAR(255),
"txtProperty2" VARCHAR(255),
"txtProperty3" VARCHAR(255),
"txtProperty4" VARCHAR(255),
"txtProperty5" VARCHAR(255),
... many more of these
PRIMARY KEY ("id")
KEY "WInvestmentDetail_idx01" ("groupId"),
... several more indices
) ENGINE=INNODB;
现在,以下查询在查询时间花费约0.8秒,在提取时间花费约0.2秒,总共约一秒钟。该查询返回大约67,000行数据。
SELECT eventId
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
在选择子句中添加更多的ID实际上不会改变性能。
SELECT eventId, groupId, activityId, insertDate
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
然而,添加一个“属性”列会使其获取时间为0.6秒,查询时间为1.8秒。
SELECT eventId, txtProperty1
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
现在,让我们来谈一些真正让你叹为观止的事情。使用txtProperty2代替txtProperty1,可以将时间缩短到0.8秒的提取和24秒的查询!
SELECT eventId, txtProperty2
FROM Warehouse
WHERE accountId IN (10, 8, 13, 9, 7, 6, 12, 11)
AND scenarioId IS NULL
AND insertDate BETWEEN DATE '2002-01-01' AND DATE '2011-12-31'
ORDER BY insertDate;
这两列的数据类型基本相同:大多数非空,并且都没有索引(不过这应该没有影响)。为了确保表本身健康,我对其进行了分析/优化。
这真的让我感到困惑。我可以理解仅在选择子句中添加列可能会略微增加提取时间,但它不应该改变查询时间,特别是不应该有明显的变化。如果您有任何关于导致这种减速的原因的想法,我将不胜感激。
编辑-更多数据点
实际上,SELECT * 的性能优于 txtProperty2-0.8秒查询,8.4秒提取。太糟糕了,我不能使用它,因为提取时间(预计)太长。