2013-03-18 102 views
1

我在閱讀高性能MySQL:優化,備份和複製通過Schwartz,Zaitsev & Tkachenko(第3版,Oreilly)。迄今爲止,這本書很棒。不過,我在Chapter 5 on page 183中遇到了不一致(對於長鏈接抱歉,Google Books不會給我一個更好的鏈接)。使用Sakila sample database的「租賃」表,我們執行一些SELECT查詢,這些查詢應該使用索引來掃描和排序結果。在我的MySQL 5.5服務器上,當我運行Google Books上顯示的突出顯示的查詢時,它似乎沒有像預期的那樣使用rental_date索引。MySQL索引掃描排序不工作

這是本書中的一個錯誤,是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

是'\ G'結束時選擇的東西正常嗎? – Sebas 2013-03-18 23:13:37

+0

@Sebas \ G以這種格式返回查詢結果,而不是像表格那樣;會給你。 – ESG 2013-03-18 23:45:37

+0

'\ G'修飾符只是將輸出格式化爲列表。你可以用傳統的分號替換它。它只會改變格式。 – 2013-03-18 23:46:59

回答

1

這可能是由於微小變化。 MySQL已經確定,可能執行全表掃描的速度要比從索引讀取大量行更快。大約10%以上的行通常會觸發該行爲。

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

+0

是的,這是正確的,但在這種情況下,它沒有辦法加快FTS ... – Sebas 2013-03-18 23:52:21

+0

爲什麼博客文章顯示possible_keys爲空?在我的情況下,possible_keys正確顯示rental_date鍵。這讓我覺得這兩種情況有所不同。 – 2013-03-19 02:24:13

+0

我錯誤地鏈接到錯誤的博客文章。這裏是另一篇博客帖子,討論這個問題: http://www.mysqlperformanceblog.com/2006/06/02/indexes-in-mysql/ – 2013-03-19 16:15:07

0

這是因爲你使用的是InnoDB。將引擎更改爲使用MyISAM。 alter table rental engine=myisam;

+0

租賃表使用外鍵(未顯示在我顯示的部分表結構中),MyISAM不支持。雖然我認爲你是對的,它會在MyISAM上按預期運行。從[這篇文章](http://mysql.rjweb.org/doc.php/myisam2innodb),'...當「使用索引」對PRIMARY KEY有用時,MyISAM將執行「索引掃描」,但InnoDB實際上必須進行「表掃描」。 – 2013-03-19 22:09:55