针对特定查找优化的索引

Posted

技术标签:

【中文标题】针对特定查找优化的索引【英文标题】:Index optimised for specific lookup 【发布时间】:2012-08-17 08:21:44 【问题描述】:

我有一个表(可能会变大,大约数百万行),我会定期在其上执行查询 SELECT * from table WHERE somefield = 20,并且我希望此查询能够快速运行。在任何时候,我都希望这个查询在可能的数百万中最多返回 10 行,对于这个特定的值 20(不保证任何其他值)。索引这个的正确方法是什么?仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?或者还有其他我可以尝试优化的技巧吗?

【问题讨论】:

我已投票决定将其移至 dba.stackexchange.com 【参考方案1】:

此查询的理想索引单独应该是具有键列somefield 并包含表中所有其他列的列的索引(通过使索引聚簇或具有INCLUDE 选项)。

这将允许直接查找值并避免书签查找的需要。

但是包含所有这些列的 NCI 的维护开销会影响数据修改操作,您可能更喜欢在不同的键列上定义 CI 以使其他查询受益或避免碎片

因此,出于这个原因,您可能更愿意单独在 somefield 上定义 NCI,并使用 10 个书签查找。这是一个平衡的行为。

编辑。实际上,如果您对优化 somefield = 20 的查询感兴趣,那么您可以在该值上创建一个 filtered index。然后我可能会include 该索引定义中的所有列。

【讨论】:

过滤后的索引,这似乎正是我想要的【参考方案2】:

仅在某个字段上放置索引并确保统计信息大致是最新的就足够了吗?

是的,很简单。确保 somefield 是正确的类型(即 int)。如果 somefield 需要包含文本,您可以做更多的事情,否则正常索引就可以了。

如果您不需要通过不使用 SELECT * 返回的每个字段(您可能不需要某个字段,因为您已经知道它是什么)。

【讨论】:

【参考方案3】:

是的,您想在某个字段上添加索引。

如果你不做其他查询,那么你可能想把它变成一个聚集索引,但是没有上下文,很难下定论。

【讨论】:

以上是关于针对特定查找优化的索引的主要内容,如果未能解决你的问题,请参考以下文章

MySQL优化-索引

mysql---索引优化

mysql索引优化分析

查询优化器

MySQL优化

MySQL优化-索引