【问题标题】:How to use index in select statement?如何在 select 语句中使用索引?
【发布时间】:2011-09-29 10:36:49
【问题描述】:

假设在员工表中,我在表的emp_name 列上创建了一个索引(idx_name)。

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

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

【问题讨论】:

    标签: sql database indexing


    【解决方案1】:

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

    SELECT * FROM TABLE WHERE attribute = 'value'
    

    将使用适当的索引。

    【讨论】:

      【解决方案2】:

      好问题,

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

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

      对于 MySQL,您想阅读Index Hint Syntax 文档以了解如何执行此操作

      【讨论】:

        【解决方案3】:

        优化器会判断使用你的索引是否会让你的查询运行得更快,如果是,就会使用索引。

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

        一般来说,您应该索引在表连接和 where 语句中使用的列

        【讨论】:

          【解决方案4】:

          一般情况中,如果使用索引的假定成本(然后可能必须执行进一步的书签查找)低于仅扫描整个表的成本,则将使用该索引。 p>

          如果您的查询是以下形式:

          SELECT Name from Table where Name = 'Boris'
          

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

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

          SELECT * from Table where Name = 'Boris'
          

          然后它可能仍然选择执行表扫描,如果它是一个合理的假设,它会花费更多的时间从表中检索其他列而不是只查找名称,或者再次,如果它可能无论如何都要检索很多行。

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

              如果你想测试索引看看它是否有效,下面是语法:

              SELECT *
              FROM Table WITH(INDEX(Index_Name))
              

              WITH 语句将强制使用索引。

              【讨论】:

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

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

              【讨论】:

                【解决方案8】:

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

                但是,您可以强制优化器使用类似的东西进行扫描

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

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

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

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

                为获得最佳结果,请首先列出返回最少结果的过滤器。 我不知道我说的是否正确,但查询过滤器似乎是连续的;如果您的序列正确,那么优化器就不必通过比较所有组合来为您做这件事,或者至少不必开始与更昂贵的查询进行比较。

                【讨论】:

                  猜你喜欢
                  • 2021-06-19
                  • 2015-09-17
                  • 1970-01-01
                  • 2011-11-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-06-20
                  • 1970-01-01
                  相关资源
                  最近更新 更多