【问题标题】:Which clause's column need to be indexed?需要索引哪个子句的列?
【发布时间】:2020-08-13 15:44:17
【问题描述】:

select查询的以下模式中:

        ┌┐           ↘ ┌┐ ⎫┌┐      ┌┐
        ├┤           ↗ └┘ ⎭└┘    → └┘
        ├┤    ┌┐
        ├┤ →  ├┤       ┌┐ ⎫
        ├┤    └┘     ↘ ├┤ ⎪               ↘  ┌┐
        ├┤           ↗ ├┤ ⎪┌┐             ↗  ├┤
        ├┤  → ┌┐     ↘ ├┤ ⎪└┘             ↘  └┘
        ├┤    └┘       └┘ ⎭                         LIMIT
        ├┤  WHERE   GROUP BY    HAVING   ORDER BY   OFFSET
        ├┤
        ├┤  → ┌┐       ┌┐ ⎫
        ├┤    ├┤     ↗ ├┤ ⎪┌┐      ┌┐
        ├┤    └┘     ↘ ├┤ ⎪└┘    → └┘
        ├┤  → ┌┐     ↗ └┘ ⎭
        ├┤    └┘
        ├┤    ┌┐
        └┘    └┘

我如何决定,哪个子句的列需要索引来提高性能?是ORDER BY吗?

【问题讨论】:

  • 不,您首先使用索引来查找感兴趣的行。所以它是WHERE。接下来要考虑的是GROUP BY
  • 顺便说一句,这是一个很好的图形表示。显示了查询从左到右经历的阶段。并且索引是按照相同的顺序构建的。
  • @ThorstenKettner 当我们在表(t) 列上创建索引i 时,是否需要对it 运行select 查询?索引后
  • 在桌子上。查询不会改变。索引不会出现在查询中。可以说,索引是在幕后使用的,它为 DBMS 提供了一种快速访问表数据的方法 DBMS 可能会或可能不会在查询中为表使用一个或多个可用索引。如果在某个时间点我们决定为表引入(附加)索引,则可能不仅我们想到的查询运行得更快,而且其他几个查询也运行得更快。

标签: sql database indexing


【解决方案1】:

让我们举个具体的例子:orders 表包含了向供应商下达的产品订单。

select product_number, sum(amount) as total
from orders
where order_date > date '2020-01-01'
and supplier_number = 1234
group by product_number
having sum(amount) > 100
order by product_number;

我们从订单表中进行选择,但只对某些订单感兴趣,特别是 2020 年的订单和供应商 1234。为了快速找到行,您需要索引日期和供应商。由于它有几个日期,但我们只寻找一个供应商,我们希望供应商在索引中的日期之前:

create index idx on orders (supplier_number, order_date);

一旦 DBMS 找到了这些行,它就会对每个产品的订购量求和。因此,我们可以将 product_number 添加到索引中,因为我们知道 DBMS 需要它来获取组。

create index idx on orders (supplier_number, order_date, product_number);

然后建立总和,只保留总金额超过 100 的那些产品。我们不能索引它;这是聚合的结果。不过,我们仍然可以将金额放入索引中。在这种情况下,DBMS 甚至不必读取表,因为查询所需的所有信息都已经在索引中。这称为覆盖索引。

create index idx on orders (supplier_number, order_date, product_number, amount);

【讨论】:

  • create index 是否在内部创建 B+ 树?用于快速搜索遍历..
  • 这可能取决于 DBMS,但是是的,b-tree 通常是默认索引类型。
【解决方案2】:

Where 子句的列需要索引 因为你需要根据条件获取数据。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多