1

この SQL を実行するのに問題があります:

ここに画像の説明を入力

だと思いますindex problemが、私はこのデータベースを作成しておらず、単純なプログラマーであるため、わかりません。

問題は、そのテーブルに 64260 のレコードがあるため、実行時にクエリが狂ってしまうことです。コンピューターがフリーズするため、mysql を停止して再度実行する必要があります。

ありがとう。

編集:テーブル スキーマ

CREATE TABLE IF NOT EXISTS `value_magnitudes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `value` float DEFAULT NULL,
  `magnitude_id` int(11) DEFAULT NULL,
  `sdi_belongs_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `reading_date` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1118402 ;

クエリ

select * from value_magnitudes
where id in 
(
    SELECT min(id)
    FROM value_magnitudes
    WHERE magnitude_id = 234
    and date(reading_date) >= '2013-04-01'
    group by date(reading_date)
)

EDIT2

ここに画像の説明を入力

4

3 に答える 3

2

毎日の結果を取得したいので、関数を使用して datetime 列から日付を抽出する必要がありますdate()。それはインデックスを役に立たなくします。

reading_date列をreading_dateとに分割できますreading_time。次に、関数なしでクエリを実行すると、インデックスが機能します。

さらに、クエリをjoin

select * 
from value_magnitudes v
inner join 
(
    SELECT min(id) as id
    FROM value_magnitudes
    WHERE magnitude_id = 234
    and reading_date >= '2013-04-01'
    group by reading_date
) x on x.id = v.id
于 2013-05-10T11:30:54.840 に答える
2

まず、 にインデックスを追加します(magnitude_id, reading_date)

ALTER TABLE
  ADD INDEX magnitude_id__reading_date__IX       -- just a name for the index
    (magnitude_id, reading_date) ;

次に、このバリエーションを試してください。

SELECT vm.* 
FROM value_magnitudes AS vm
  JOIN 
  ( SELECT MIN(id) AS id
    FROM value_magnitudes
    WHERE magnitude_id = 234
      AND reading_date >= '2013-04-01'         -- changed so index is used
    GROUP BY DATE(reading_date)
  ) AS vi
    ON vi.id = vm.id ;

GROUP BY DATE(reading_date)@jurgenのアドバイスに従って列を と 列に分割しない限り、選択されたすべての(インデックスを介して)行に関数を適用する必要があり、これを改善することはできませdatetime

于 2013-05-10T11:42:09.443 に答える
1

まず、クエリを次のように変更します。

select * from value_magnitudes where id = (
  select min(id) from value_magnitudes
  where magnitude_id = 234
  and DATE(reading_date) >= '2013-04-01' 
)

サブクエリが 1 つのレコードのみを返す場合は、IN 句を使用する必要はありません。

次に、サブクエリで照会しているものであるため、magnitude_id と reading_date (おそらく 2 つのフィールド インデックス) にインデックスがあることを確認します。そのインデックスがなければ、毎回テーブルをスキャンしています。

また、可能であれば、magnitude_id と reading_date を null 以外に変更してください。Null 値とインデックスはあまり適していません。

于 2013-05-10T11:24:30.430 に答える