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

Viv*_*vek 87 sql database indexing

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

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

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

小智 79

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

SELECT *
FROM Table WITH(INDEX(Index_Name))
Run Code Online (Sandbox Code Playgroud)

WITH语句将强制使用索引.

  • 这篇文章没有回答这个问题.简而言之,答案是:您不必在查询中指定索引.它是自动使用(或不使用).但是,你可以强制它.以下其他帖子中的更多详细信息(何时以及为何这样做). (68认同)
  • 这篇文章回答了最相关的部分“在选择查询中使用索引的语法是什么?”。它没有明确表示“是”或“不是”。在我的用例中,有一个索引,但由于某种原因没有使用它。在表名旁边添加WITH(INDEX(..)) 解决了我的问题! (4认同)

Tud*_*tin 33

好问题,

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

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

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


Vde*_*deX 27

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

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


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
Run Code Online (Sandbox Code Playgroud)


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);
Run Code Online (Sandbox Code Playgroud)

还有更多方法可以检查这一点

我需要明确指定吗?

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


Dam*_*ver 13

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

如果您的查询格式如下:

SELECT Name from Table where Name = 'Boris'
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * from Table where Name = 'Boris'
Run Code Online (Sandbox Code Playgroud)

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


nik*_*trs 9

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

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

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


Chr*_*int 6

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

SELECT * FROM TABLE WHERE attribute = 'value'
Run Code Online (Sandbox Code Playgroud)

将使用适当的索引。


MD *_*med 5

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

但是,在MSSQL中,您可以指定index hint哪个可以指定应该使用特定索引来执行此查询.有关这方面的更多信息,请点击此处.

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