2013-03-29 95 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