如何使MySQL更高效地运行?

如何使MySQL更高效地运行?,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,此查询从一个可靠的小表返回一个建议列表(提示),该表当前有数千行。但它返回提示的速度太慢,不太有用。其他大多数问题都建议向DB查询减速的位置。我真的没有这样做所需的权限。现在看起来像下面,也许有人可以帮我看一个我不知道的技巧。我真的想加快以下查询的速度 $stmt = $db_found->prepare("SELECT DISTINCT callsign, Fname, ID, grid, tactical, latitu

此查询从一个可靠的小表返回一个建议列表(提示),该表当前有数千行。但它返回提示的速度太慢,不太有用。其他大多数问题都建议向DB查询减速的位置。我真的没有这样做所需的权限。现在看起来像下面,也许有人可以帮我看一个我不知道的技巧。我真的想加快以下查询的速度

$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
的工作原理。是的,注意,你是对的,但它会优化查询结果。