【问题标题】:Optimizing MySQL queries from command line从命令行优化 MySQL 查询
【发布时间】:2021-02-24 09:15:31
【问题描述】:

我想优化一些 MySQL 查询。

我在我的应用程序中使用knex 来构建查询。使用toSQL(),我可以得到如下格式的SQL:

{
   sql: 'SELECT * FROM Table WHERE id = ?',
   bindings: [1]
}

我的问题是优化这些查询的最佳方法是什么?如果我将 sql 复制到命令行中,以便与EXPLAIN 一起使用,我需要一种绑定参数的方法。我怎样才能做到这一点?

或者,有没有比使用 MySQL shell 检查优化器的查询计划更好的工具?

编辑:我刚刚将查询复制到文本编辑器并手动提供所有参数绑定。

【问题讨论】:

  • 使用EXPLAIN,您需要存根您自己的值,或者您需要使用某种查询更改代码在您的应用程序中运行它,例如'EXPLAIN ' + query
  • 假设 id 是 PK,除了命名你真正想要返回的列之外,没有太大的优化空间。
  • 是的,这不是我要优化的实际查询。真正的查询有一堆连接和子查询、排序函数等。这只是为了简单地说明问题。
  • 如果你想优化它,你的 MySQL 查询才是最重要的,而不是你用来发送查询的 JS。这使得它不清楚。 Here's an answer I have to a similar question,以询问是否JOIN vs WHERE is better为例。希望这可以帮助。干杯。
  • 是的,我可以确认您需要提供真实值才能使用 EXPLAIN。您可以选择代表应用工作负载的值。

标签: mysql sql knex.js


【解决方案1】:

我写了一个小的 js 方法来做绑定

function prepareStatment(obj) {
  let i = 0;
  const sql = obj.sql.replace(/\?/g, () => JSON.stringify(obj.bindings[i++]));
  copy(sql); // works only if you run it in chromes console.
  return sql;
}

prepareStatment({
   sql: 'SELECT * FROM Table WHERE id = ?',
   bindings: [1]
}) // will return `SELECT * FROM Table WHERE id = "1"`

注意 - 此方法在生产环境中使用不安全

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2011-07-07
    • 2018-12-21
    • 2010-12-15
    相关资源
    最近更新 更多