很抱歉很长的帖子,但这真的很奇怪,我很接近放弃。 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
答案 0 :(得分:0)
简短回答:因为它更快。
答案很长......
你的EXPLAIN似乎不完整 - 我希望每行2行。
第一张表是第二张表的20(70?)倍。优化器选择较小的表开始。因此,它最初的工作量是1/20。后来的排序(ORDER BY ...
)要比开始工作20倍的工作少得多。
输出只有48K行,对吗?这就是第二个表中有多少行,对吗?
你的test
表没有相同的更大/更小的比例,是吗?因此,不同的EXPLAIN
。