改进MySQL查询

时间:2014-02-11 20:47:41

标签: mysql

我有以下查询使用replyAutoId=0过滤该行,然后获取每个propertyId的最新记录。现在查询需要0.23225秒仅从5,435行获取21,369,我想改进这一点。我要问的是,有没有更好的方法来编写这个查询?有什么建议吗?

SELECT pc1.* FROM (SELECT * FROM propertyComment WHERE replyAutoId=0) as pc1
                       LEFT JOIN propertyComment as pc2
                            ON pc1.propertyId= pc2.propertyId AND pc1.updatedDate < pc2.updatedDate
                       WHERE pc2.propertyId IS NULL

SHOW CREATE TABLE propertyComment输出:

CREATE TABLE `propertyComment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `propertyId` int(11) NOT NULL,
  `agentId` int(11) NOT NULL,
  `comment` longtext COLLATE utf8_unicode_ci NOT NULL,
  `replyAutoId` int(11) NOT NULL,
  `updatedDate` datetime NOT NULL,
  `contactDate` date NOT NULL,
  `status` enum('Y','N') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'N',
  `clientStatusId` int(11) NOT NULL,
  `adminsId` int(11) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `propertyId` (`propertyId`),
    KEY `agentId` (`agentId`),
    KEY `status` (`status`),
    KEY `adminsId` (`adminsId`),
    KEY `replyAutoId` (`replyAutoId`)
) ENGINE=MyISAM AUTO_INCREMENT=21404 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

2 个答案:

答案 0 :(得分:1)

SELECT pc1.* FROM (SELECT * WHERE replyAutoId=0) as pc1
                       LEFT JOIN (SELECT propertyID, updatedDate from propertyComment order by 1,2) as pc2
                            ON pc1.propertyId= pc2.propertyId AND pc1.updatedDate < pc2.updatedDate
                       WHERE pc2.propertyId IS NULL

您还没有任何索引?

如果您使用主键,则表示您没有加入主键,那么为什么要包含它呢?

为什么不从B表中选择您感兴趣的列?这将限制您从表B中选择的列数。由于您从表A中提取了replyAutoID = 0的所有内容,因此将列限制在那里没有多大意义。这应该加快一点。

答案 1 :(得分:1)

尝试摆脱嵌套查询。

以下查询应该提供与原始查询相同的结果:

SELECT pc1.*
FROM propertyComment AS pc1
LEFT JOIN propertyComment AS pc2
ON pc1.propertyID = pc2.propertyId AND pc1.updatedDate < pc2.updatedDate
WHERE pc1.replyAutoId = 0 AND pc2.propertyID IS NULL