2013-03-29 148 views
2

我一直在試圖找到以下問題的簡明答案,我讀了很多,但我仍然不確定。也許沒有簡單的答案,因爲情景可能如此不同。mysql索引性能

但這裏的問題:

1)如果我索引TINYINT列所有記錄0或者1?

實例查詢其中postActive列具有每個記錄爲0或1:

SELECT postId, postName, postTitle 
FROM postTable 
WHERE postDate > Now() 
AND postActive = 1 

2)我應該索引int列,其中所有記錄具有0不同之處在於具有一個備用int值記錄即表中獨一無二的?

對於此示例,列orderProcessingId將在表中爲100%唯一(零除外),絕大多數記錄對於orderProcessingId爲0。

SELECT orderId, orderInformation, orderData, orderStuff 
FROM orderTable 
WHERE orderProcessingId = 38457237 

在這兩個表中都有數十萬條記錄。

我想我是問題的原因是因爲它似乎索引將取決於相對分佈的頻率值來提高性能。但實施例1中僅存在兩個(且僅有兩個)值的非常高的頻率,和實施例2中有一個值(0),並且沒有重複頻率的例外的極高的頻率。

但我的想法都基於猜想......所以。你能告訴我什麼?

回答

3

我想我是問題的原因是因爲它似乎索引取決於相對分佈頻率的值來提高性能。

不一定。

我應該索引一個tinyint列,其中所有記錄是0還是1?

取決於 - 這些值的分佈是否基本相同,如果不是您是否主要關心值顯着較少的值。

我應該索引一個int列,其中所有記錄都有0,除了表中有一個唯一的int值的記錄嗎?

由於您正在嘗試搜索其中一種罕見且獨特的值 - 是的。

(我希望你不會混淆0NULL這裏,順便說一句 - 。因爲如果你的整數類型的記錄條目,除了那些具有價值0獨特的,你不能在這裏使用一個唯一索引。)

+0

感謝CBroe 。在第一個例子中,大多數記錄是1.但是,有700k 1和400k 0之類的。我總是隻對看1的感興趣。 例如2,你是說我應該允許Null並使用獨特的索引來獲得更好的性能? (現在我正在使用0和普通索引) – userlite

+0

在700k 1和400k 0的情況下,在某些情況下,它甚至可能會隨着索引變慢。如果您有1%1和99%0,MySQL大多數時間都會做正確的事情(只有在選擇1時才使用索引)。 – Vatev

+1

嗯,在這個問題的幾乎每個答案中都有一個_「它取決於」。當然,提問者必須嘗試一下,測量並使用'EXPLAIN'來找出真正發生的效應。 – CBroe