如何在选择语句中使用索引?


97

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

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

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

Answers:


86

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

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITH语句将强制使用索引。


82
这篇文章没有回答这个问题。简而言之,答案是:您不必在查询中指定索引。它会自动使用(或不使用)。但是,您可以强制执行。更多详细信息(何时以及为什么这样做)在下面的其他帖子中。
2014年

34

好问题,

通常,数据库引擎应根据其构建的查询执行计划自动选择要使用的索引。但是,在极少数情况下,您想强制数据库使用特定的索引。

为了能够回答您的特定问题,您必须指定要使用的数据库。

对于MySQL,您需要阅读有关如何执行此操作的索引提示语法文档


30

如何在选择语句中使用索引?
这条路:

   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);

还有更多的方法检查

我需要明确指定吗?

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

13

一般,如果使用索引,然后可能不必执行进一步书签查找的成本假定不仅仅是扫描整个表的成本低的索引将被使用。

如果您的查询采用以下形式:

SELECT Name from Table where Name = 'Boris'

每1000行中就有1行名为Boris,几乎肯定会使用它。如果每个人的名字都是鲍里斯(Boris),则可能会使用表扫描,因为索引不太可能是访问数据的更有效策略。

如果它是一个宽表(很多列),您可以执行以下操作:

SELECT * from Table where Name = 'Boris'

然后,如果可以合理地假设从表中检索其他列要比查找名称花费更多的时间,或者可能再次检索名称,则它仍可能选择执行表扫描。反正很多行。


9

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

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

通常,您应该索引在表联接和where语句中使用的列


5

通过在您的条件下使用该索引所适用的列,该列将自动包含在内。您不必使用它,但是使用它可以加快查询速度。

SELECT * FROM TABLE WHERE attribute = 'value'

将使用适当的索引。


5

通常,当您在表上创建索引时,数据库将在搜索该表中的数据时自动使用该索引。您无需为此做任何事情。

但是,在MSSQL中,您可以指定,index hint后者可以指定应使用特定的索引来执行此查询。有关此的更多信息,请参见此处

Index hint似乎也可用于MySQL。感谢都铎君士坦丁。


1

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

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

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

或者通过使用类似的东西来寻找特定的索引

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.