我有一个独立的表格,我们通过每周工作插入数据,并在搜索模块中检索数据。
当我执行直接选择查询需要很长时间(大约15秒)时,该表有大约4百万条记录(并且会变大)。我正在使用MySql DB。
这是我的表结构
CREATE TABLE `myTable` (
`myTableId` int(11) NOT NULL AUTO_INCREMENT,
`date` varchar(255) DEFAULT NULL,
`startTime` int(11) DEFAULT NULL,
`endTime` int(11) DEFAULT NULL,
`price` decimal(19,4) DEFAULT NULL,
`total` decimal(19,4) DEFAULT NULL,
`taxes` decimal(19,4) DEFAULT NULL,
`persons` int(11) NOT NULL DEFAULT '0',
`length` int(11) DEFAULT NULL,
`total` decimal(19,4) DEFAULT NULL,
`totalPerPerson` decimal(19,4) DEFAULT NULL,
`dayId` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`myTableId`)
);
当我运行以下语句时,大约需要15秒来检索结果。 那么,如何优化它更快。
SELECT
tt.testTableId,
(SELECT
totalPerPerson
FROM
myTable mt
WHERE
mt.venueId = tt.venueId
ORDER BY totalPerPerson ASC
LIMIT 1) AS minValue
FROM
testTable tt
WHERE
status is NULL;
请注意,testTable tble只有大约15条记录。
答案 0 :(得分:1)
这是查询:
SELECT tt.testTableId,
(SELECT mt.totalPerPerson
FROM myTable mt
WHERE mt.venueId = tt.venueId
ORDER BY mt.totalPerPerson ASC
LIMIT 1
) as minValue
FROM testTable tt
WHERE status is NULL;
对于子查询,您需要mytable(venueId, totalPerPerson)
上的索引。对于外部查询,不需要索引。但是,如果表格较大,则需要testTable(status, venueId, testTableId)
上的索引。
答案 1 :(得分:0)
使用MIN
和GROUP BY
可能会更快。
SELECT tt.testTableId, MIN(totalPerPerson)
FROM testTable tt
INNER JOIN mytable mt ON tt.venueId = mt.venueId
WHERE tt.status is NULL
GROUP BY tt.testTableId