2014-10-27 20 views
0

我正在執行一個查詢,該命令將命令BOOLEAN字段(TINYINT(1))上的結果。它被索引。布爾字段上的命令比PK上的命令慢得多

SELECT * FROM `main_catalog` ORDER BY `main_catalog`.`is_tv_on_itunes` ASC LIMIT 1 

這需要1.61秒的時間來運行。如果我做同樣的查詢沒有ORDER BY,需要花費的一小部分時間:

SELECT * FROM `main_catalog` LIMIT 1 

這需要4.1ms完成。爲什麼在布爾型字段上排序比在PK上排序要花費更多時間?

+0

表格有多少條記錄?即使您使用的是「LIMIT 1」,MySQL也必須在返回1條記錄之前對記錄進行排序。另外,你可以檢查'EXPLAIN EXTENDED SELECT * FROM main_catalog ORDER BY main_catalog.is_tv_on_itunes ASC LIMIT 1',這會告訴你索引是否被使用。 – Jaylen 2014-10-28 00:23:11

+0

要檢查的另一件事是sort_buffer_size的值。 '如果此值設置得太低,則顯示全局變量'sort_buffer_size',如果sort_buffer_size的值低於默認值,則會影響默認值的順序爲2097144嘗試設置會話值並查看您是否看到改進'SET SESSION sort_buffer_size = 5242880' – Jaylen 2014-10-28 00:34:19

+0

@MIKE - 值爲:'sort_buffer_size \t 262144'。該表大約有1M行和312MB。 – David542 2014-10-28 00:39:47

回答

0

爲什麼在布爾型字段上排序比在PK上花費的時間要長很多?

這很簡單。主鍵具有一個索引,可以按排序順序檢索記錄,而無需進行排序。你有一個簡單的查詢,所以這個索引可以用於檢索。 (有一個額外的優化,因爲行是在主鍵順序,但這是一個小的額外增益相比,索引。)

您可以創建一個索引main_catalog(is_tv_on_itunes)或類似的附加字段。

而且,只爲記錄​​,查詢:

SELECT * 
FROM `main_catalog` 
LIMIT 1 

是否排序主鍵。查詢中的結果不保證以任何特定的順序。如果您希望按主鍵順序排列,那麼您需要添加一個order by聲明來保證。

+1

謝謝,儘管在上面的例子中,布爾字段也是索引的。 – David542 2014-10-28 00:46:34

+0

@ user1436531。 。 。它是索引中的第一列嗎? – 2014-10-28 00:53:06