mysql使用filesort选择顺序没有使用索引

时间:2015-05-25 12:23:19

标签: mysql indexing temporary filesort

很抱歉很长的帖子,但这真的很奇怪,我很接近放弃。 2桌:

CREATE TABLE `endu_results` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `base_name` varchar(200) NOT NULL,
 `base_nr` int(11) DEFAULT NULL,
 `base_yob` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `endu_results_206a6355` (`base_name`),
 KEY `endu_results_63df4402` (`base_nr`),
 KEY `base_yob` (`base_yob`)
 ) ENGINE=InnoDB AUTO_INCREMENT=3424028 DEFAULT CHARSET=utf8;enter code here

和第二名:

CREATE TABLE `endu_resultinterest` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `result_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `endu_resultinterest_3b529087` (`result_id`),
  CONSTRAINT `result_id_refs_id_19e24435` FOREIGN KEY (`result_id`) REFERENCES `endu_results` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48590 DEFAULT CHARSET=utf8;

在endu_resultstable中有大约2mln记录,而在endu_resultinterest中有少于100K的记录。我的查询速度很慢:

explain select base_yob from endu_resultinterest 
inner join endu_results 
on (endu_results.id = endu_resultinterest.result_id) 
order by endu_results.base_yob;

1   SIMPLE  endu_resultinterest index   endu_resultinterest_3b529087    endu_resultinterest_3b529087    4   NULL    47559   Using index; Using temporary; Using filesort

问题是:为什么mysql使用这个索引:endu_resultinterest_3b529087 - 但它应该使用base_yob - 这是请求排序的地方?

为了进一步测试,我已经手动创建了另外两个相同的表 endu_testresults endu_testresultintrest 并填写了一些记录:

CREATE TABLE `endu_testresults` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `base_yob` int(11) DEFAULT NULL,
 `base_name` varchar(200) NOT NULL,
 `base_nr` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
KEY `endu_testresults_a65b2616` (`base_yob`),
KEY `endu_testresults_ba0ab39c` (`base_name`),
KEY `endu_testresults_d75ba04d` (`base_nr`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

所以我再去解释一下:

explain select base_yob from endu_testresultinterest 
inner join endu_testresults 
on (endu_testresults.id = endu_testresultinterest.result_id) 
order by endu_testresults.base_yob;

惊讶发生

 1  SIMPLE  endu_testresults    index   PRIMARY    endu_testresults_a65b2616    5   NULL    19  Using index

现在使用索引排序列base_yob(endu_testresults_a65b2616)。

为什么在一个案例中使用了索引而在另一个案例中我使用了“使用filesort;使用临时? 尺寸重要吗?我将尝试将记录从一个复制到另一个,但不要使用索引。 MySql是5.6.16

1 个答案:

答案 0 :(得分:0)

简短回答:因为它更快。

答案很长......

你的EXPLAIN似乎不完整 - 我希望每行2行。

第一张表是第二张表的20(70?)倍。优化器选择较小的表开始。因此,它最初的工作量是1/20。后来的排序(ORDER BY ...)要比开始工作20倍的工作少得多。

输出只有48K行,对吗?这就是第二个表中有多少行,对吗?

你的test表没有相同的更大/更小的比例,是吗?因此,不同的EXPLAIN