1

Schwartz、Zaitsev、Tkachenko によるHigh Performance MySQL: Optimization, Backups, and Replication (第 3 版、Oreilly)を読んでいます。これまでのところ素晴らしい本です。しかし、 183 ページの第 5 章で矛盾を見つけました(リンクが長くて申し訳ありません。Google ブックスではこれ以上のリンクはありません)。Sakila サンプル データベースの「レンタル」テーブルを使用して、結果のスキャンと並べ替えにインデックスを使用することになっている SELECT クエリをいくつか実行します。MySQL 5.5 サーバーで、Google ブックスに表示されている強調表示されたクエリを実行すると、期待どおりに Rental_date インデックスが使用されていないようです。

これは本の間違いでしたか、MySQL のバージョンの違いなどでしたか?

関連するテーブル構造:

CREATE TABLE rental (
  `rental_id` int(11) NOT NULL AUTO_INCREMENT,
  `rental_date` datetime NOT NULL,
  `inventory_id` mediumint(8) unsigned NOT NULL,
  `customer_id` smallint(5) unsigned NOT NULL,
  ...
  PRIMARY KEY (rental_id),
  UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
  ...
) ENGINE=InnoDB;

問題のクエリと、得られた結果:

> EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date > '2005-05-25' ORDER BY rental_date, inventory_id\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental
         type: ALL
possible_keys: rental_date
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 16338
        Extra: Using where; Using filesort
1 row in set (0.00 sec)
4

2 に答える 2

1

これは、バージョン間のオプティマイザのわずかな違いが原因である可能性があります。MySQL は、インデックスから大量の行を読み取るよりも、完全なテーブル スキャンを実行する方が高速である可能性が高いと判断しました。通常、行の約 10% を超えると、その動作がトリガーされます。

参照: http://www.mysqlperformanceblog.com/2012/11/23/full-table-scan-vs-full-index-scan-performance/

于 2013-03-18T23:19:02.117 に答える
0

InnoDB を使用しているためです。MyISAM を使用するようにエンジンを変更します。 alter table rental engine=myisam;.

于 2013-03-19T05:37:15.663 に答える