如何让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