我正在阅读施瓦茨,扎伊采夫和他的高性能MySQL:优化,备份和复制。 Tkachenko(第3版,Oreilly)。到目前为止,这是一本很棒的书。但是,我在Chapter 5 on page 183中遇到了一个不一致的问题(对于长篇链接感到抱歉.Google Books不会给我一个更好的链接)。使用Sakila sample database中的“rental”表,我们执行一些SELECT查询,这些查询应该使用索引来扫描和排序结果。在我的MySQL 5.5服务器上,当我运行Google Books上显示的突出显示的查询时,它似乎没有像预期的那样使用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)
答案 0 :(得分:1)
这可能是由于版本之间的优化器略有不同。 MySQL确定可能执行全表扫描比从索引读取大量行更快。超过大约10%的行通常会触发该行为。
请参阅:http://www.mysqlperformanceblog.com/2012/11/23/full-table-scan-vs-full-index-scan-performance/
答案 1 :(得分:0)
这是因为你正在使用InnoDB。更改引擎以使用MyISAM。 alter table rental engine=myisam;
。