【问题标题】:How to use index with Knex.js and MySQL如何在 Knex.js 和 MySQL 中使用索引
【发布时间】:2020-08-26 18:23:31
【问题描述】:

我使用 Knex.js 为列创建了索引,但找不到任何使用方法。

knex('my_table')
.select('*')
.where('my_table.status', '2')

索引名称为:my_table_stats_idx

我可以用 kex.raw() 来做到这一点:

FROM my_table USE INDEX(my_table_stats_idx)

但我不得不使用不适合 raw()

的复杂查询构建

有没有办法用 Knex 做到这一点?

【问题讨论】:

    标签: mysql sql indexing query-optimization knex.js


    【解决方案1】:

    在 SQL 中,您不会告诉数据库它应该使用哪个索引。您所做的只是描述您想要的结果:数据库决定如何处理您的语句。为此,查询计划器会考虑各种信息,当然包括可用的索引。如果它估计使用索引的计划是最优的,则使用索引 - 否则不是。

    您不知道索引的定义是什么。对于您的查询,最佳索引可能是my_table(status) 上的单列索引。

    最后:在大多数数据库中,都有一些方法可以通过提示来建议数据库使用给定的索引。这些在查询计划器无法自行解决问题的边缘情况下很有用。您的查询显然不够复杂,不足以符合这种情况。

    【讨论】:

    • 所以,我不需要再做什么了?!好的,我会试试的。只是为了解释一下,这不是我真正的查询。真正的有 30 行或更多行。不过谢谢你的回答!
    • @dm707:不,你不需要再做任何事情了。只需确保the statistics of the table are up to date,以便 MySQL 拥有构建最佳查询计划所需的所有信息。
    【解决方案2】:

    在 from 子句中需要 knex.raw

       knex
      .select('*')
       .where('my_table.status', '2')
      .from(knex.raw('my_table  FORCE INDEX(my_table_stats_idx)'))
    

    【讨论】:

    • 我试过了,但是像这样使用 knex 已经被弃用了。我们应该像这样使用:knex('my_table')。不过谢谢
    • 该语法在最新版本knexjs.org
    • 我认为他们没有更新整个文档。它没有显示在侧边栏上,但它仍然出现在几乎所有代码示例中。但是当我使用它时会收到已弃用的消息。
    猜你喜欢
    • 2018-02-02
    • 2018-08-16
    • 2021-06-11
    • 1970-01-01
    • 2014-04-17
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多