1

私は次の表を持っています

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;

そしていくつかのサンプルデータ

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);

そして、各プランの最新の料金を知りたい。次のクエリがあります

SELECT p1.id, p1.date, p1.price
FROM prod_prices p1
LEFT JOIN prod_prices p2 ON p1.id = p2.id
AND p1.date < p2.date
WHERE p2.id IS NULL

これは機能しますが、本当にひどいパフォーマンスをもたらします。 EXPLAINショー

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE          p1      ALL     NULL             NULL    NULL        NULL   5   
1   SIMPLE          p2      ref     PRIMARY         PRIMARY     98       p1.id   1      Using where; Using index; Not exists

したがって、p1テーブル選択はインデックスを使用していません。何か問題でもありますか?

4

3 に答える 3

1

これにより、同じ結果が得られ、パフォーマンスが大幅に向上するはずです。

SELECT  p1.*
FROM    prod_prices p1
        INNER JOIN
        (   SELECT  ID, MAX(Date) AS Date
            FROM    prod_prices
            GROUP BY ID
        ) AS p2
            ON p1.ID = p2.ID 
            AND p1.Date = p2.Date
于 2012-06-17T16:42:18.017 に答える
0

これを試して

SELECT p1.id, p1.date, p1.price
FROM prod_prices p1
Where p1.id NOT IN 
(Select id fro prod_prices p2 where p2.date>p1.date)
于 2012-06-17T16:29:15.070 に答える
0

私はこのようなものをお勧めします。

最新の日付を取得する

select max(date) date,id group by id

上記のクエリを結合して、一致するレコードを選択します。

SELECT p1.id, p1.date, p1.price
FROM prod_prices p1 a,
(select max(date) date,id group by id) p2
where p1.id=p2.id and p1.date = p2.date

これにより、1 日に 1 つの製品の価格が 1 つある場合、最新の価格が得られます。

検索条件に日付フィールドと、テーブル スキャンを強制する Null 値を含むフィールドが含まれているため、パフォーマンスが低下しました。

于 2012-06-17T16:35:17.897 に答える