从命令行优化 MySQL 查询
Optimizing MySQL queries from command line
我想优化一些 MySQL 查询。
我在我的应用程序中使用 knex 来构建查询。使用 toSQL()
,我能够以如下格式获得 SQL:
{
sql: 'SELECT * FROM Table WHERE id = ?',
bindings: [1]
}
我的问题是优化这些查询的最佳方式是什么?如果我将 sql 复制到命令行中,以便与 EXPLAIN
一起使用,我需要一种绑定参数的方法。我怎样才能做到这一点?
或者,有没有比使用 MySQL shell 检查优化器的查询计划更好的工具?
编辑:我刚刚将查询复制到文本编辑器并手动提供所有参数绑定。
我写了一个小的 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"`
注意 - 这种方法在生产环境中使用不安全
我想优化一些 MySQL 查询。
我在我的应用程序中使用 knex 来构建查询。使用 toSQL()
,我能够以如下格式获得 SQL:
{
sql: 'SELECT * FROM Table WHERE id = ?',
bindings: [1]
}
我的问题是优化这些查询的最佳方式是什么?如果我将 sql 复制到命令行中,以便与 EXPLAIN
一起使用,我需要一种绑定参数的方法。我怎样才能做到这一点?
或者,有没有比使用 MySQL shell 检查优化器的查询计划更好的工具?
编辑:我刚刚将查询复制到文本编辑器并手动提供所有参数绑定。
我写了一个小的 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"`
注意 - 这种方法在生产环境中使用不安全