2013-01-15 33 views
2

我想知道为什么下面的查询不使用索引时,我解释它。MySQL在哪里+组+订单; filesort和不使用索引

EXPLAIN SELECT 
    `t`.`id`, `t`.`omschrijving_kort`, `t`.`oplos_tijd_issue` 
FROM `incident` `t` 
LEFT OUTER JOIN `plaats` `plaatsen` ON (`plaatsen`.`incident_id`=`t`.`id`) 
WHERE 
    t.type='2' AND t.status='1' 
GROUP BY t.id 
ORDER BY `t`.`oplos_tijd_issue` 

我的表:

CREATE TABLE `incident` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `omschrijving_kort` varchar(40) NOT NULL, 
    `sla_type` tinyint(1) unsigned NOT NULL, 
    `prioriteit` tinyint(1) unsigned NOT NULL, 
    `laatste_wijziging` timestamp NULL default NULL, 
    `aanmaak_tijd` timestamp NULL default NULL, 
    `start_tijd_issue` timestamp NULL default NULL, 
    `oplos_tijd_issue` timestamp NULL default NULL, 
    `impact` int(11) unsigned default NULL, 
    `template_id` int(10) unsigned default NULL, 
    `type` tinyint(1) unsigned NOT NULL default '1', 
    `subtype` tinyint(1) NOT NULL default '1', 
    `status` tinyint(1) unsigned NOT NULL default '1', 
    `regio_id` smallint(5) unsigned default NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_template` (`template_id`), 
    KEY `start_tijd_issue` (`start_tijd_issue`), 
    KEY `id_startTijdIssue` (`id`,`start_tijd_issue`), 
    KEY `id_oplosTijdIssue` (`id`,`oplos_tijd_issue`), 
    KEY `id_subtype_status` (`id`,`subtype`,`status`), 
    KEY `id` (`id`,`afsluiting_tijd`), 
    KEY `id_2` (`id`,`oplos_tijd_issue`,`status`), 
    KEY `FK_regios` (`regio_id`), 
    KEY `id_3` (`id`,`status`), 
    KEY `id_4` (`id`,`start_tijd_issue`,`oplos_tijd_issue`,`type`,`status`), 
    KEY `id_5` (`id`,`prioriteit`), 
    KEY `id_6` (`id`,`type`,`status`,`regio_id`), 
    KEY `id_7` (`id`,`oplos_tijd_issue`,`type`,`status`,`regio_id`), 
    KEY `id_8` (`id`,`regio_id`), 
    KEY `oplos_tijd_issue_2` (`oplos_tijd_issue`,`type`,`status`), 
    KEY `id_9` (`oplos_tijd_issue`,`type`,`status`,`id`), 
    KEY `id_10` (`id`,`type`,`status`), 
    KEY `type` (`type`,`status`,`id`,`oplos_tijd_issue`), 
    KEY `oplos_tijd_issue` (`type`,`status`,`oplos_tijd_issue`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我曾尝试添加索引到我的表...也许太多了!

从我抬头看,一个索引(type, status, oplos_tijd_issue)应该足够吗?

EXPLAIN告诉我:

possible keys: type, oplos_tijd_issue 
key: type 
ref: const, const 
Extra: Using where; Using temporary; Using filesort 
+0

除了过度索引,MySQL的索引基数可能太低而无法使用索引,因此它会选择遍历整个数据集。即使您设置了索引,也并不意味着它会被使用或者它是最佳索引。索引不是“魔术”,你不能只扔大量的索引,并希望一切都很快。 –

+1

同意@ N.B .;索引太多。 – Kermit

回答

0

我怀疑问题是一个类型转换的问题。这可能会混淆MySQL和索引。试试这个:

EXPLAIN SELECT 
    `t`.`id`, `t`.`omschrijving_kort`, `t`.`oplos_tijd_issue` 
FROM `incident` `t` 
LEFT OUTER JOIN `plaats` `plaatsen` ON (`plaatsen`.`incident_id`=`t`.`id`) 
WHERE 
    t.type=2 AND t.status=1 
GROUP BY t.id 
ORDER BY `t`.`oplos_tijd_issue` 

小心保持数字类型与字符类型分开,当你可以。

+0

谢谢你回复戈登。遗憾的是,这不是原因。 EXPLAIN输出没有变化。 –