我在mysql中有一个包含超过80M记录的表。在MYISAM引擎中。
当我运行此查询时
SELECT id FROM mytable WHERE (key1=-5) AND key2=467476 ORDER BY id DESC LIMIT 1
查询很慢,5分钟后我必须终止查询以释放表。
但是,当我只是增加限制大小时,此查询在44毫秒内成功运行
例如(我只是增加限制大小):
SELECT id FROM mytable WHERE (key1=-5) AND key2=467476 ORDER BY id DESC LIMIT 2
现在要解决这个问题,我尝试以下查询,这项工作成功(这是临时解决方案)
SELECT id FROM (SELECT id FROM mytable WHERE (key1=-5) AND key2=467476 ORDER BY id DESC LIMIT 2) AS tbl ORDER BY id DESC LIMIT 1
请注意 :id是主要和自动增量!
更新
key1 ==> folder_id
key2 ==>用户ID
CREATE TABLE `bm60_mails` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) NOT NULL DEFAULT '0',
`betreff` varchar(255) CHARACTER SET utf8 NOT NULL,
`von` varchar(255) CHARACTER SET utf8 NOT NULL,
`an` varchar(255) CHARACTER SET utf8 NOT NULL,
`cc` varchar(255) CHARACTER SET utf8 NOT NULL,
`body` longtext NOT NULL,
`folder` int(11) NOT NULL,
`datum` int(11) NOT NULL DEFAULT '0',
`trashstamp` int(11) NOT NULL,
`priority` enum('low','normal','high') NOT NULL,
`fetched` int(11) NOT NULL DEFAULT '0',
`msg_id` varchar(128) CHARACTER SET utf8 NOT NULL,
`virnam` varchar(128) CHARACTER SET utf8 NOT NULL,
`trained` tinyint(4) NOT NULL DEFAULT '0',
`refs` text CHARACTER SET utf8 NOT NULL,
`flags` int(11) NOT NULL DEFAULT '-1',
`size` int(11) NOT NULL,
`color` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `mailUser` (`userid`),
KEY `mailFlags` (`flags`),
KEY `mailFolder` (`folder`)
) ENGINE=MyISAM AUTO_INCREMENT=95953499 DEFAULT CHARSET=latin1
答案 0 :(得分:1)
我怀疑如果你在(key1, key2, id)
上创建一个复合索引,你的问题就会消失。
还包括id
列,因为它不是MyISAM表中隐含的,而是在InnoDB表中。