2011-07-06 78 views
58

可以说在员工表中,我已经在表格的emp_name列上创建了一个索引(idx_name)。如何在select语句中使用索引?

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

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

回答

55

如果你要测试的指标,看它是否有效,这里是语法:

SELECT * 
FROM Table WITH(INDEX(Index_Name)) 

with语句将迫使指数使用。

+40

此帖未回答此问题。简而言之,答案是:您不必在查询中指定索引。它被自动使用(或不)。但是,你可以强制它。更多细节(何时以及为什么会这样)在下面的其他帖子中。 – Rast

2

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

SELECT * FROM TABLE WHERE attribute = 'value' 

将使用适当的索引。

26

问得好,

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

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

对于MySQL,你想读如何做到这一点

8

优化器将判断是否使用索引会使你的查询运行得更快的Index Hint Syntax文档,如果是,它会使用索引。

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

一般来说,你应该,你在表中使用索引列加入的何陈述

12

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

如果您的查询的形式是:

SELECT Name from Table where Name = 'Boris' 

和1个排出来的有1000名鲍里斯,它几乎肯定会被使用。如果每个人的名字都是Boris,那么它可能会采用表扫描,因为索引不太可能成为访问数据的更有效的策略。

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

SELECT * from Table where Name = 'Boris' 

然后,它仍然可以选择执行表扫描,如果它是一个合理的假设,这将需要更多的时间检索表中的其他列比查找名称还要多,如果它可能会检索很多行,

4

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

但是,在MSSQL中,您可以指定一个index hint,它可以指定应使用特定索引来执行此查询。有关这方面的更多信息可以在here找到。

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

18

如何在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答案构建的查询执行计划自动选择要使用的索引。
  • 优化器将判断您的索引的使用是否会使您的查询运行得更快,如果是,它将使用索引。 from @niktrl回答