【问题标题】:DOs and DONTs for Indexes [closed]索引的 DO 和 DONT [关闭]
【发布时间】:2011-08-31 05:09:09
【问题描述】:

使用索引提高数据库性能的 DO 和 DONT 有哪些?

DO 是应该创建一个索引的情况,或者是另一个与索引相关的提示,可以提高性能。

不应该创建索引或其他可能损害性能的索引相关操作的情况。

【问题讨论】:

  • 这个问题太宽泛了。
  • 从接近的原因:“过于宽泛”。这个问题需要大量的、很可能是主观的清单,而这些清单通常是不受欢迎的。
  • @Orbling 我不明白怎么做,我在问有哪些可以提高数据库性能的索引的 DO 和有害的 DONT,我看不出有什么主观的答案。我将编辑问题并澄清它。
  • 就个人而言,我认为这是一个很好的 wiki 问题候选者,应该重新打开它。
  • @Orbling 我敢肯定有很多通用技巧在 80% 的情况下有效/无效,我想知道它们。

标签: mysql database performance database-design indexing


【解决方案1】:

一般来说:

1。除非您确实需要,否则不要添加索引。

每个索引都会使写入变慢...

2。索引将用于 where 子句:

-- index on foo (bar)
select bar from foo where bar = :bar;

出于同样的原因,它将用于外键引用(在两个表上)。

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3。索引将用于排序,尤其是在绑定到限制时:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4。当 2. 和 3. 都适用时,多列索引有时很有用。

在这种情况下,将 where 条件放在首位,排序键放在最后:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5。及时更新您的表格统计信息。

如果表统计信息是垃圾,优化器使用您的索引的可能性很小。如果需要,手动清理/分析您的数据库。

6。索引使用情况取决于您的表重新分区。

超过检索行的特定阈值,执行全表扫描会更快。如果您的索引位于或多或少将您的表一分为二的布尔字段上,则它永远不会被使用。

同样,如果您的数据以这样一种方式存储,即索引扫描最终可能会随机访问该表几乎所有适用的磁盘页面,那么规划器将更喜欢全表扫描。

7。考虑可用的部分/表达式索引。

如果您有一个字段除了 10% 的行之外具有相同的值,请考虑在其上设置部分索引(即不是该值的位置)。这会在不影响其实际用途的情况下产生更小的索引。

如果您不断查询应用于列的表达式并且您的平台提供表达式索引,请考虑在其上添加索引。使用时,不会为每一行计算表达式。

【讨论】:

  • 使用 MySQL 时,您必须小心处理多列索引。它们对相等范围查询的处理方式不同。
【解决方案2】:
  1. 从整体上衡量系统吞吐量。索引可能有助于某些查询,但会损害插入、更新和删除。

  2. 创建索引。

  3. 从整体上衡量系统吞吐量。

如果性能更好,请将索引留在那里。如果性能较差,请将其删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多