回答

收藏

糟糕的MySQL LEFT JOIN性能,逐组最大化

技术问答 技术问答 311 人阅读 | 0 人回复 | 2023-09-12

我有下表& {- W+ a8 B) Z" P0 i- s
CREATE TABLE `prod_prices` (  `id` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `date` date NOT NULL, `price` decimal(10,2) NOT NULL, PRIMARY KEY (`id`,`date`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;还有一些样本数据/ k" J- R7 q% w9 l. G
INSERT INTO `prod_prices` (`id`,`date`,`price`) VALUES('plan_a','2012-06-15',10.20),('plan_a','2012-06-16',10.30),('plan_b','2012-06-15',5.20),('plan_b','2012-06-16',5.30),('plan_b','2012-06-17',5.50);并且想知道每个计划的最新价格。我有以下查询. Y2 X7 ~7 H( `  C1 H4 x
SELECT p1.id,p1.date,p1.priceFROM prod_prices p1LEFT JOIN prod_prices p2 ON p1.id = p2.idAND p1.date 这种方法虽然能产生真正的不良表现,但还是有效的。EXPLAIN表演
8 J0 r6 _* Y. J6 p. V' cid  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra1   SIMPLE          p     ALL     NULL             NULL    NULL        NULL  55   1            SIMPLE          p二       ref     PRIMARY         PRIMARY                                                                                                                                                                                                                                     p1.id        Using where; Using index; Not exists因此p1表选择不使用任何索引。什么事?- ^) u+ V" [, m
                                                               
( t* E6 p9 H0 P4 Y- _9 P    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则