0

私はこのスキーマを持つテーブルを持っています -

CREATE TABLE `ox_data_summary_device_hourly` (
  `data_summary_device_hourly_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `date_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  ...
   
  ...
  PRIMARY KEY (`data_summary_device_hourly_id`),
  KEY `ox_data_summary_device_daily_date_time` (`date_time`),
  KEY `ox_data_summary_device_daily_ad_country_date_time` (`ad_id`,`date_time`),
  KEY `ox_data_summary_device_daily_zone_id_date_time` (`zone_id`,`date_time`)
) ENGINE=InnoDB AUTO_INCREMENT=3478837682 DEFAULT CHARSET=latin1

したがって、次のインデックスがテーブルに設定されます-

 KEY `ox_data_summary_device_daily_date_time` (`date_time`),
 KEY `ox_data_summary_device_daily_ad_country_date_time` (`ad_id`,`date_time`),
 KEY `ox_data_summary_device_daily_zone_id_date_time` (`zone_id`,`date_time`)

フィルターをオンにして、このテーブルにこの説明クエリがありますdate_time-

explain SELECT *

FROM ox_data_summary_device_hourly data_hourly 

WHERE 
data_hourly.date_time >= '2012-09-01 00:00:00' AND data_hourly.date_time < '2012-09-15 13:00:00' 

GROUP BY data_hourly.type ORDER BY data_hourly.type DESC

ox_data_summary_device_daily_date_timeこれは、インデックスが適用されていないことを示す出力です-

ここに画像の説明を入力

ただし、上記のクエリの日付フィルターを次のように変更すると、

data_hourly.date_time >= '2012-09-01 00:00:00' AND data_hourly.date_time < '2012-09-14 13:00:00'

つまり、9 月 1 日から 9 月 15 日までではなく、9 月 1 日から 9 月 14 日までのクエリを実行すると、ox_data_summary_device_daily_date_timeインデックスが適用されます。さらに、範囲の終了日が より後の15 sep場合、インデックスは適用されないことを確認しました。

私は困惑しています。9 月 15 日以降の日付範囲のデータがテーブルにあることを確認しました。

何か案は?

4

2 に答える 2

1

私にはオプティマイザーのように聞こえます-クエリによって調べられている行が多すぎて、インデックスを有効にできないと考えています。これは、狭い範囲でも問題ない理由を説明しています。

より短い日付範囲を照会するか、DATETIME の代わりに DATE を使用できると思います。

ANALYZE または OPTIMIZE を実行することも役立つ場合があります。ここにまともな概要記事があります

幸運を。

于 2012-09-17T15:48:29.170 に答える
1

インデックスが使用されていない理由はわかりませんが、FORCE INDEXオプションを追加することでこれを解決できるかもしれません:

SELECT *
FROM ox_data_summary_device_hourly data_hourly 
FORCE INDEX (ox_data_summary_device_daily_date_time)
WHERE 
data_hourly.date_time >= '2012-09-01 00:00:00' AND 
data_hourly.date_time < '2012-09-15 13:00:00' 
GROUP BY data_hourly.type ORDER BY data_hourly.type DESC

また、BETWEEN演算子を使用すると読みやすくなり、パフォーマンスがわずかに向上する場合もあります。

SELECT *
FROM ox_data_summary_device_hourly data_hourly 
FORCE INDEX (ox_data_summary_device_daily_date_time)
WHERE 
data_hourly.date_time BETWEEN 
    '2012-09-01 00:00:00' AND 
    '2012-09-15 13:00:00' - INTERVAL 1 SECOND
GROUP BY data_hourly.type ORDER BY data_hourly.type DESC
于 2012-09-17T15:42:01.200 に答える