mysql索引性能

mysql索引性能,mysql,performance,indexing,Mysql,Performance,Indexing,我一直试图找到以下问题的简明答案,我读了很多,但我仍然不确定。也许没有简单的答案,因为场景可能会如此不同 但问题是: 1)我应该为所有记录都是0或1的tinyint列编制索引吗? postActive列的每个记录都是0或1的查询示例: SELECT postId, postName, postTitle FROM postTable WHERE postDate > Now() AND postActive = 1 2)我是否应该为一个int列编制索引,在该列中,除了具有表中唯一的可选i

我一直试图找到以下问题的简明答案,我读了很多,但我仍然不确定。也许没有简单的答案,因为场景可能会如此不同

但问题是:

1)我应该为所有记录都是0或1的tinyint列编制索引吗?

postActive列的每个记录都是0或1的查询示例:

SELECT postId, postName, postTitle
FROM postTable
WHERE postDate > Now()
AND postActive = 1
2)我是否应该为一个int列编制索引,在该列中,除了具有表中唯一的可选int值的记录外,所有记录都为0?

在本例中,列orderProcessingId在表中是100%唯一的(除零外),并且绝大多数记录的orderProcessingId为0

SELECT orderId, orderInformation, orderData, orderStuff
FROM orderTable
WHERE orderProcessingId = 38457237
在这两个表中都有数十万条记录

我想我质疑的原因是,索引似乎依赖于相对分布的值频率来提高性能。但在示例1中,两个(并且只有两个)值的频率都非常高,而在示例2中,一个值(0)的频率非常高,并且异常没有重复频率

但我的想法几乎都是基于猜测。。。所以你能告诉我什么

我想我质疑的原因是,索引似乎依赖于相对分布的值频率来提高性能

不一定

我应该为所有记录都是0或1的tinyint列编制索引吗

取决于–取决于这些值的分布是否大体相等,如果不相等,则取决于您是否对发生的值感兴趣

我是否应该索引一个int列,其中除具有表中唯一的可选int值的记录外,所有记录都为0

因为您正在尝试搜索这些罕见且独特的值之一–是的


(顺便说一句,我希望您不要混淆这里的
0
NULL
。-因为如果您的整数类型条目是唯一的,除了那些值
0
,您不能在这里使用唯一索引。)

谢谢您。在第一个示例中,大多数记录为1。但是,大约有700k 1和400k 0。我总是只对1感兴趣。例如,你是说我应该允许Null并使用唯一索引以获得更好的性能吗?(现在我使用的是0和一个正常的索引)在700k1和400k0的情况下,在某些情况下,索引可能会变得更慢。如果你有1%1和99%0的MySQL,那么它在大多数情况下都会做正确的事情(只有当你选择1时才使用索引)。好吧,对于这样的问题,几乎每个答案都有一个“视情况而定”。当然现在,提问者必须尝试、测量并使用
解释
来找出真正发生的影响。@CBroe我同意。还要注意的是,当您有50%的0和50%的统一整数时,
EXPLAIN
可能会产生误导(例如,它显示了50行,但实际上有100k)。使用NULL而不是0可能更好,但我还没有测试过。