下記のテーブル定義のように(product_id, version, received, id DESC)とインデックスを作成し、
クエリのwhere句に(product_id, version, received)を指定し、order by句に(id DESC)を指定しています。
ですが、Explainの結果のExtraが「Using index condition; Using filesort」となってしまいます。
「Using index」のみとなる想定だったのですが・・・。
クエリ、もしくはインデックスの書き方におかしいところなどありますでしょうか。
###テーブル
CREATE TABLE `measurements` (
`id` INT ZEROFILL NOT NULL AUTO_INCREMENT,
`product_id` INT ZEROFILL NOT NULL,
`version` VARCHAR(16) NOT NULL,
`key` VARCHAR(64) NOT NULL,
`value` VARCHAR(128) NOT NULL,
`datetime` DATETIME NOT NULL,
`received` TIMESTAMP(3) NOT NULL,
PRIMARY KEY (`id`),
INDEX `idx01` (`product_id` ASC, `version` ASC, `received` ASC, `id` DESC),
INDEX `idx02` (`received` ASC),
INDEX `idx03` (`datetime` ASC))
ENGINE = InnoDB ;
###クエリ(explain)
MariaDB > EXPLAIN SELECT
-> *
-> FROM
-> measurements
-> WHERE
-> `product_id` = 569
-> AND
-> `version` = '2.00'
-> AND
-> `received` > '2017-02-06 19:27:40'
-> ORDER BY
-> `id` DESC ;
+------+-------------+--------------+-------+---------------+-------+---------+------+------+---------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+--------------+-------+---------------+-------+---------+------+------+---------------------------------------+
| 1 | SIMPLE | measurements | range | idx01,idx02 | idx01 | 60 | NULL | 2675 | Using index condition; Using filesort |
+------+-------------+--------------+-------+---------------+-------+---------+------+------+---------------------------------------+
1 row in set (0.00 sec)
MySQL(MariaDB)のバージョン
MariaDB > SELECT version();
+-----------------------+
| version() |
+-----------------------+
| 10.0.28-MariaDB-wsrep |
+-----------------------+
1 row in set (0.00 sec)
Using index
Only the index is used to retrieve the needed information from the table. There is no need to perform an extra seek to retrieve the actual record.
詳細にご回答ありがとうございます。
ご回答頂いていた内容をこちらでも試していたので遅くなりました。
インデックスに対する知識・認識が甘く、②で Using index となると思っていました。
「インデックスの情報のみを使用してデータを取得できる場合に使用できる方法」である、ということを理解していませんでした。
(単純に対象レコードを探すという意味で検索そのものをインデックスだけで行えれば Using index となると思っていました)
その際またご質問させていただくことがあるかもしれませんがよろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/09 02:45
2017/02/09 03:07