0

約 1 億 5000 万行の次の MySQL テーブルがあります。

CREATE TABLE `data` (
  `datetime` datetime NOT NULL,
  `value1` decimal(12,6) NOT NULL,
  `value2` decimal(12,6) NOT NULL,
  `value3` decimal(12,6) NOT NULL,
  `value4` decimal(12,6) NOT NULL,
  `value5` decimal(12,6) NOT NULL,
  `symbol_id` int(11) NOT NULL,
  PRIMARY KEY (`symbol_id`,`datetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 億 5000 万行は、symbol_id で指定された 9500 シンボルに均等に分割されます。

テーブルで次のクエリを実行しようとしています。

SELECT datetime FROM data WHERE symbol_id = 1234 AND datetime <= "2013-03-01 15:00:00" ORDER BY datetime DESC LIMIT 1

クエリで EXPLAIN を実行すると、以下が返されます。

           id: 1
  select_type: SIMPLE
        table: data
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 12
          ref: NULL
         rows: 23856
        Extra: Using where; Using index

クエリの実行には平均で約 300 ミリ秒かかります。これを高速化するには、どのインデックスを追加できますか?

ありがとう!

4

2 に答える 2

2

Gordonが示唆しているように、クエリのパフォーマンスを向上させるインデックスはありません。

それは、それを高速化するためにできることは何もないということではありません-DBMSとOS I / Oを調整します-あなたはそれが現在どのように構成されているか、それが何で実行されているか、または使用パターンがどのようなものかについての情報を提供していません。このプロセスを開始していない場合は、インストールに対してmysqltuner.plを実行することをお勧めしますが、必ずしも完全に正しいとは限りません。別のエンジンを使用すると、このクエリのパフォーマンスが向上する可能性がありますが、システムで行われている他のすべてに依存します。

複数のディスク間でインデックスをシャーディングしたり、インデックスストレージにSSDを使用したりすることで、大きなメリットが得られます。ほとんどの場合、メモリを増やすと役立ちます。

MySQLチューニングに関する優れた本を手に入れて、時間をかけて読んでください。

于 2013-03-02T22:44:28.153 に答える
0

このクエリのパフォーマンスは、インデックスを使用して改善できる可能性がありますが、最初に列のカーディナリティを決定する必要があります。

SELECT COUNT(DISTINCT `datetime`) FROM `data`;
SELECT COUNT(DISTINCT `symbol_id`) FROM `data`;

最も多くの一意の値を返すものはカーディナリティが高く、最適な複合インデックスを持つには、列がカーディナリティの降順になっている必要があります。

現在、次の順序で列を持つ複合主キーがあります。

PRIMARY KEY (`symbol_id`,`datetime`)

symbol_id のカーディナリティが datetime よりも高い場合、クエリをさらに最適化することはできません。一方、datetime のカーディナリティが高い場合は、datetime の後に symbol_id が続くインデックスを追加する必要があります。

INDEX idx_datetime_symbol (`datetime`,`symbol_id`)
于 2013-03-03T02:09:16.907 に答える