尽管索引,mysql选择查询缓慢

时间:2011-04-13 16:18:02

标签: mysql select

好的,这是交易:

我有一个名为Mails的小4Gb表,我在其上执行以下两个查询:

SELECT * FROM Mails WHERE sent = 1 ORDER BY date ASC LIMIT 600;  // 200ms
SELECT * FROM Mails WHERE sent = 0 ORDER BY date ASC LIMIT 600;  // >9000ms

发送类型之间的关系如下:

0    192070
1   1112341
2   11992
3   5369

create语句是:

CREATE TABLE `Mails` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idMail` varchar(100) COLLATE utf8_bin NOT NULL,
  `type` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `idSender` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `senderfName` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `senderlName` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `senderMail` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `receiverMail` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `reference` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `mailContent` text COLLATE utf8_bin,
  `mailSubject` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `sent` int(1) unsigned DEFAULT '0',
  `opened` int(1) unsigned DEFAULT '0',
  `clicked` int(1) unsigned DEFAULT '0',
  `completed` int(1) unsigned DEFAULT '0',
  `abstract` varchar(100) COLLATE utf8_bin DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idMail` (`idMail`),
  KEY `fk_type` (`type`),
  KEY `fk_idSender` (`idSender`),
  KEY `fk_senderMail` (`senderMail`),
  KEY `fk_receiverMail` (`receiverMail`),
  KEY `fk_sent` (`sent`),
  KEY `fk_reference` (`reference`),
  KEY `fk_date` (`date`)
) ENGINE=MyISAM AUTO_INCREMENT=1321784 DEFAULT CHARSET=utf8 COLLATE=utf8_bin$$

为什么heck是“更重”的查询更快或实际上在所有加载?自我的线索:这一切都与order-by子句有关,因为没有日期排序它对两者来说都是快速闪电。不好的事,我需要那个日期订购严重。我无法通过id订购,因为邮件可以在未来生成,我需要已经通过NOW()并且尚未发送的邮件。

[编辑2011-04-14]

AJ的减速正确答案可以在下面找到。我们解决这个问题的方法是创建一个连接索引

KEY `sent` (`sent`,`date`)

完全解决了所有问题。

1 个答案:

答案 0 :(得分:2)

使用EXPLAIN确定MySQL如何缓冲排序结果:

http://dev.mysql.com/doc/refman/5.1/en/using-explain.html

如果没有足够的排序缓冲区,它将使用磁盘上的临时空间,这会更慢。另请参阅调整服务器参数和 myisam_sort_buffer_size

http://dev.mysql.com/doc/refman/5.1/en/server-parameters.html