mysql使用文件排序按顺序选择未使用索引

mysql使用文件排序按顺序选择未使用索引,mysql,indexing,temporary,filesort,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_206a63

很抱歉发了这么长的帖子,但这真的很奇怪,我快要放弃了。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_ResultsTest中的记录则少于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_resultentrest_3b529087-但它应该使用base_yob-这就是请求排序的地方

为了进一步测试,我手动创建了另外两个相同的表endu_testresults和endu_TestResultInRest,并用一些记录填充这些表:

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;
令人惊讶的是:

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


为什么在一种情况下使用索引,而在另一种情况下我得到“使用文件排序”;使用临时的?尺寸重要吗?我将尝试将记录从一个复制到另一个,但不使用索引获取它。MySql是5.6.16

简单回答:因为它更快

长长的回答

你的解释似乎不完整——我希望每一行有两行

第一张桌子是第二张桌子的20(70?)倍大。优化器首先选择较小的表。因此,它最初只做了工作量的1/20。之后的排序(
orderby…
)比一开始就要做20倍的工作要少得多

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

您的
测试
表没有相同的大/小比率,是吗?因此不同的
解释

 1  SIMPLE  endu_testresults    index   PRIMARY    endu_testresults_a65b2616    5   NULL    19  Using index