1

我正在阅读Schwartz、Zaitsev 和 Tkachenko 的《高性能 MySQL:优化、备份和复制》(第 3 版,Oreilly)。到目前为止,这是一本很棒的书。但是,我在第 183 页的第 5 章中遇到了不一致的情况(很抱歉链接太长。Google 图书不会给我更好的链接)。使用Sakila 示例数据库中的“出租”表,我们执行了几个 SELECT 查询,这些查询应该使用索引来扫描和排序结果。在我的 MySQL 5.5 服务器上,当我运行 Google Books 上突出显示的查询时,它似乎没有像预期的那样使用 rent_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 回答