好的低速选择查询,这里的交易:的mysql尽管索引
我有一个可爱的小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是“更重”的查询更快或实际上在所有加载?对自我的线索:这一切都与订购条款有关,因为如果没有日期排序,它们对于两者都是闪电般的。糟糕的是,我需要那个日期严格排序。我不能通过id命令,因为邮件可以生成到将来,我需要那些已经通过NOW()并且尚未发送的邮件。
[EDIT 2011-04-14]
的正确答案由AJ减速可以在下面找到。我们对这个问题的解决方案是创建一个加入索引
KEY `sent` (`sent`,`date`)
解决绝对一切。
是否发送= 0时的日期列有一堆空的? – Dave 2011-04-13 16:26:43
复合'(发送,日期)'索引可能会有所帮助。正如@Dave:指出的,NULL可以通过ORDER BY查询来杀死性能。 – 2011-04-13 16:46:53
不,在日期没有空值。 – John 2011-04-14 10:28:10