使用限制1

时间:2017-08-22 11:40:45

标签: mysql database relational-database query-performance

我在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 

1 个答案:

答案 0 :(得分:1)

我怀疑如果你在(key1, key2, id)上创建一个复合索引,你的问题就会消失。

还包括id列,因为它不是MyISAM表中隐含的,而是在InnoDB表中。