Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在select语句中使用索引?_Sql_Database_Indexing - Fatal编程技术网

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

Sql 如何在select语句中使用索引?,sql,database,indexing,Sql,Database,Indexing,假设在employee表中,我在表的emp\u name列上创建了一个索引(idx\u name) 我是否需要在select子句中显式指定索引名,否则它将自动用于加速查询 如果需要在select子句中指定,在select查询中使用索引的语法是什么?通过在您的条件中使用索引应用到的列,它将自动包括在内。您不必使用它,但使用它时会加快查询速度 SELECT * FROM TABLE WHERE attribute = 'value' 将使用适当的索引。好问题 通常,数据库引擎应该根据它构建的查询执

假设在employee表中,我在表的
emp\u name
列上创建了一个索引(idx\u name)

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


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

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

SELECT * FROM TABLE WHERE attribute = 'value'
将使用适当的索引。

好问题

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

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


对于MySQL,您需要阅读有关如何执行此操作的文档,优化器将判断使用索引是否会使查询运行更快,如果是,则会使用索引

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

通常,您应该为表join和where语句中使用的列编制索引。通常,如果使用索引的假定成本以及随后可能需要执行进一步书签查找的成本低于仅扫描整个表的成本,则将使用索引

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

SELECT Name from Table where Name = 'Boris'
1000行中有1行的名字叫Boris,几乎肯定会被使用。如果每个人的名字都是Boris,它可能会求助于表扫描,因为索引不太可能是访问数据的更有效策略

如果它是一个宽表(很多列),您可以:

SELECT * from Table where Name = 'Boris'

然后,如果合理地假设从表中检索其他列所花费的时间比只查找名称所花费的时间要长,那么它仍然可以选择执行表扫描,或者再次选择执行表扫描,如果它可能检索大量行。

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

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


索引提示
似乎也可用于。多亏了都铎·君士坦丁

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

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITH语句将强制使用索引。

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



还有更多的检查方法

是否需要明确指定?

  • 不,不需要显式指定
  • DB引擎应该根据它从@Tudor Constantin answer生成的查询执行计划自动选择要使用的索引
  • 优化者将判断使用索引是否会使查询运行更快,如果是,则将使用索引。来自@niktrl-answer

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

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

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...
    Select  *
    From    [yourtable] With (Index(1))
    Where   ...
或者使用以下方法来查找特定索引:

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...
    Select  *
    From    [yourtable] With (Index(1))
    Where   ...
选择权在你。在对象面板中查看表的索引属性,了解要使用的索引。它应该与您的过滤器匹配

要获得最佳结果,请列出首先返回最少结果的过滤器。
我不知道我的说法是否正确,但似乎查询过滤器是连续的;如果你的顺序正确,乐观主义者就不必通过比较所有的组合来为你做这件事,或者至少不必用更昂贵的查询开始比较。

这篇文章没有回答这个问题。简而言之,答案是:您不必在查询中指定索引。它是自动使用(或不使用)的。然而,你可以强迫它。更多细节(何时以及为什么这样做)在下面的其他帖子中。这篇帖子回答了最相关的部分“在选择查询中使用索引的语法是什么?”。它没有明确地说“它是”或“它不是”必需的。在我的用例中,有一个索引,但由于某种原因它没有被使用。在表名旁边添加(INDEX(..)可以解决我的问题!
    Select  *
    From    [yourtable] With (Index(1))
    Where   ...