如何使MySQL更高效地运行?
此查询从一个可靠的小表返回一个建议列表(提示),该表当前有数千行。但它返回提示的速度太慢,不太有用。其他大多数问题都建议向DB查询减速的位置。我真的没有这样做所需的权限。现在看起来像下面,也许有人可以帮我看一个我不知道的技巧。我真的想加快以下查询的速度如何使MySQL更高效地运行?,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,此查询从一个可靠的小表返回一个建议列表(提示),该表当前有数千行。但它返回提示的速度太慢,不太有用。其他大多数问题都建议向DB查询减速的位置。我真的没有这样做所需的权限。现在看起来像下面,也许有人可以帮我看一个我不知道的技巧。我真的想加快以下查询的速度 $stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, tactical, latitu
$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是此表中的自动增量变量。如果我从何处删除第一个,那么查询执行速度会快得多。就像这里
$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");
问题是不能保证这是最新的记录
如何加快返回速度,同时仍然确保获取此呼号的最新记录ID?将查询限制为1,并按
ORDER by recordID DESC Limit 1对结果进行排序。这样,它就不必返回整个表的内容。将查询限制为1,并按按recordID DESC Limit 1排序结果。这样,它就不必返回整个表内容。除了使用执行计划验证实际操作外,您还可以尝试以不同的方式处理数据
您可以尝试使用dinamic(temp)表而不是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;");
除了用执行计划验证实际操作外,您还可以尝试以不同的方式处理数据
您可以尝试使用dinamic(temp)表而不是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;");
如果你想优化一个查询,最好是确定问题所在。我想,是呼号字段缺少索引。
您使用LIKE运算符,所以可能就是您想要使用的。
DISTINCT
在这个查询中看起来是不必要的,因为在子查询中已经有了groupby
如果你想优化一个查询,最好是它的计划来确定问题所在。我想,是呼号字段缺少索引。
您使用LIKE运算符,所以可能就是您想要使用的。
DISTINCT
在这个查询中看起来没有必要,因为子查询中已经有了groupby
我喜欢这个声音,但是我在语法上遇到了问题。我没有得到确切的错误,但我可以在编辑器中看到语法无法验证。我应该用引号(“)将其括起来,并以a)结尾;??@KeithDKaiser。显然,这必须用双引号括起来(并以a;答案更新结束)。我仍然会遇到如下错误:#1054-on子句中的未知列“t1.recordID”@KeithDKaiser.answer更新(联接子查询中缺少别名)#scaisEdge我非常感谢您在这方面的帮助。您的上一个(非常明显但我错过了)答案成功了,而且一切都很顺利。我喜欢这个声音,但我在语法使用上遇到了问题。我没有收到任何错误,但我可以在我的编辑器中看到语法无法验证。我是否应该将它括在引号中(“)并以a)结尾@基斯德凯瑟。显然,这必须用双引号括起来(并以一个;答案更新结束。)我仍然会遇到这样的错误:#1054-on子句@KeithDKaiser.answer updated中的未知列“t1.recordID”(join subquery中缺少别名)#scaisEdge我非常感谢您在这方面的帮助。您的最后一列(非常明显,但我错过了)回答是这样的,一切都很顺利。LIMIT
不会阻止表扫描。您可以LIMIT 1
,MySQL仍会扫描整个表。请阅读LIMIT
的工作原理。是的,注意,您是对的,但它会优化查询结果。LIMIT
不会阻止表扫描。您可以LIMIT 1
MySQL仍然会扫描整个表。请阅读LIMIT
的工作原理。是的,注意,你是对的,但它会优化查询结果。