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