如何让MySQL运行更有效率?
How to make MySQL run more efficiently?
此查询 return 是一个来自可靠的小 table 的建议列表(提示),目前有几千行。但它 return 的提示太慢了,不是很有用。大多数其他问题建议轮询数据库以了解减速的位置。我真的没有必要的访问权限来做到这一点。目前看起来像下面,也许有人可以帮我看看我不知道的技术。我真的很想加快以下查询的速度。
$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid,
tactical, latitude, longitude, email, Lname
FROM NetLog
WHERE recordID IN (SELECT max(recordID)
FROM NetLog
WHERE callsign LIKE ?
AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD')
GROUP BY callsign)");
以便它提取最新版本的 recordID。 recordID是这个table中的自增变量。如果我删除第一个 FROM 和 WHERE 那么查询执行得更快。喜欢这里;
$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, tactical, latitude,
longitude, email, Lname, recordID
FROM NetLog
WHERE callsign LIKE ?
AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD')
GROUP BY callsign");
问题是不能保证这是最新的记录。
我怎样才能加快 return 的速度,并且仍然确保我得到了这个呼号的最新记录 ID?
将您的查询限制为 1,并按 ORDER BY recordID DESC LIMIT 1
对结果进行排序。这样就不必 return 整个 table 内容。
除了使用执行计划验证实际操作之外,您还可以尝试以不同方式处理数据
您可以尝试使用动态(临时)table 而不是 IN 子句
$stmt = $db_found->prepare("
SELECT DISTINCT
callsign
, Fname
, ID
, grid
, tactical
, latitude
, longitude
, email
, Lname
FROM NetLog
INNER JOIN (
SELECT max(recordID) as recordID
FROM NetLog
WHERE callsign LIKE ?
AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD')
GROUP BY callsign
) t1 on t1.recordID = NetLog.recordID;");
如果你想优化一个查询,explain它总是好的,它计划确定问题是什么。我猜是呼号字段缺少索引。
您使用 LIKE 运算符,所以可能 full text index 是您想要使用的。
DISTINCT
在此查询中看起来没有必要,因为子查询
中已有 GROUP BY
此查询 return 是一个来自可靠的小 table 的建议列表(提示),目前有几千行。但它 return 的提示太慢了,不是很有用。大多数其他问题建议轮询数据库以了解减速的位置。我真的没有必要的访问权限来做到这一点。目前看起来像下面,也许有人可以帮我看看我不知道的技术。我真的很想加快以下查询的速度。
$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid,
tactical, latitude, longitude, email, Lname
FROM NetLog
WHERE recordID IN (SELECT max(recordID)
FROM NetLog
WHERE callsign LIKE ?
AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD')
GROUP BY callsign)");
以便它提取最新版本的 recordID。 recordID是这个table中的自增变量。如果我删除第一个 FROM 和 WHERE 那么查询执行得更快。喜欢这里;
$stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, tactical, latitude,
longitude, email, Lname, recordID
FROM NetLog
WHERE callsign LIKE ?
AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD')
GROUP BY callsign");
问题是不能保证这是最新的记录。
我怎样才能加快 return 的速度,并且仍然确保我得到了这个呼号的最新记录 ID?
将您的查询限制为 1,并按 ORDER BY recordID DESC LIMIT 1
对结果进行排序。这样就不必 return 整个 table 内容。
除了使用执行计划验证实际操作之外,您还可以尝试以不同方式处理数据
您可以尝试使用动态(临时)table 而不是 IN 子句
$stmt = $db_found->prepare("
SELECT DISTINCT
callsign
, Fname
, ID
, grid
, tactical
, latitude
, longitude
, email
, Lname
FROM NetLog
INNER JOIN (
SELECT max(recordID) as recordID
FROM NetLog
WHERE callsign LIKE ?
AND callsign NOT IN ('W0KCN','WA0QFJ','T0EST','K0ERC','NR0AD')
GROUP BY callsign
) t1 on t1.recordID = NetLog.recordID;");
如果你想优化一个查询,explain它总是好的,它计划确定问题是什么。我猜是呼号字段缺少索引。
您使用 LIKE 运算符,所以可能 full text index 是您想要使用的。
DISTINCT
在此查询中看起来没有必要,因为子查询
GROUP BY