如何在select语句中使用索引?

时间:2011-07-06 08:48:34

标签: sql database indexing

让我们在employee表中说,我在表的emp_name列上创建了一个索引(idx_name)。

我是否需要在select子句中明确指定索引名称,否则它将自动用于加速查询。

如果需要在select子句中指定,在select查询中使用index的语法是什么?

8 个答案:

答案 0 :(得分:74)

如果要测试索引以查看它是否有效,请使用以下语法:

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITH语句将强制使用索引。

答案 1 :(得分:31)

好问题,

通常,数据库引擎应根据其构建的查询执行计划自动选择要使用的索引。但是,当您想强制DB使用特定索引时,有一些非常罕见的情况。

为了能够回答您的具体问题,您必须指定您正在使用的数据库。

对于MySQL,您想阅读有关如何执行此操作的Index Hint Syntax文档

答案 2 :(得分:25)

如何在select语句中使用索引?
这样:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

还有更多方法可以查看this

我是否需要明确指定?

  • 不,不需要明确指定。
  • 数据库引擎应根据@Tudor Constantin回答构建的查询执行计划自动选择要使用的索引。
  • 优化器将判断您的索引的使用是否会使您的查询运行得更快,如果是,它将使用索引。来自@niktrl回答

答案 3 :(得分:13)

general 中,如果使用索引的假定成本,然后可能必须执行进一步的书签查找低于仅扫描整个表的成本,则将使用索引。

如果您的查询格式为:

SELECT Name from Table where Name = 'Boris'

1000行中的1行有Boris这个名字,几乎肯定会被使用。如果每个人的名字都是Boris,它可能会采用表格扫描,因为索引不太可能成为访问数据的更有效策略。

如果它是一个宽表(很多列)并且你这样做:

SELECT * from Table where Name = 'Boris'

然后它仍然可以选择执行表扫描,如果它是一个合理的假设,它将花费更多的时间从表中检索其他列,而不是只查找名称,或者再次,如果它可能是无论如何都要检索很多行。

答案 4 :(得分:9)

优化器将判断您的索引的使用是否会使您的查询运行得更快,如果是,它将使用索引。

根据您的RDBMS,您可以强制使用索引,但除非您知道自己在做什么,否则不建议使用索引。

通常,您应该索引在表连接和where语句

中使用的列

答案 5 :(得分:5)

通常,在表上创建索引时,数据库将在搜索该表中的数据时自动使用该索引。你不需要做任何事情。

但是,在MSSQL中,您可以指定index hint,它可以指定应该使用特定索引来执行此查询。有关此内容的更多信息,请访问here

Index hint似乎也适用于MySQL。感谢Tudor Constantine。

答案 6 :(得分:3)

通过使用在您的条件中应用索引的列,它将自动包含在内。您不必使用它,但它会在使用时加快查询速度。

SELECT * FROM TABLE WHERE attribute = 'value'

将使用适当的索引。

答案 7 :(得分:1)

索引提示仅适用于Microsoft Dynamics数据库服务器。 对于传统的SQL Server,您在'Where'子句中定义的筛选器应说服引擎使用任何相关索引... 如果引擎的执行计划可以有效地识别如何读取信息(无论是全表扫描还是索引扫描)-它必须在执行正确的语句之前将两者进行比较,作为其内置性能优化器的一部分。

但是,您可以使用类似的方法强制优化器进行扫描

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

或者通过类似的方式来查找特定的索引

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

选择是您的。在对象面板中查看表的索引属性,以了解要使用的索引。它应该与您的过滤器匹配。

为获得最佳结果,请列出将首先返回最少结果的过滤器。 我不知道我的说法是否正确,但是查询过滤器似乎是顺序的;如果您的序列正确,那么优化器就不必通过比较所有组合来为您完成此操作,或者至少不必从比较昂贵的查询开始比较。