从数百万条记录中选择一条记录慢

时间:2015-12-02 15:41:22

标签: mysql sql database select optimization

我有一个独立的表格,我们通过每周工作插入数据,并在搜索模块中检索数据。

当我执行直接选择查询需要很长时间(大约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条记录。

2 个答案:

答案 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)

使用MINGROUP 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