如何让MySQL更高效地运行?

时间:2016-11-23 21:53:40

标签: mysql greatest-n-per-group

此查询从可靠的小表(当前数千行)返回建议列表(提示)。但它提示的速度太慢而且非常有用。大多数其他问题建议轮询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是此表中的自动增量变量。如果我删除第一个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");

问题在于无法保证这是最新的记录。

如何加快回报速度,仍然可以确保我获得此呼号的最新记录ID?

3 个答案:

答案 0 :(得分:2)

除了使用执行计划验证实际操作之外,您还可以尝试以不同方式处理数据

您可以尝试使用dinamic(temp)表而不是IN子句

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<textarea id="textInput"></textarea>
<button id="submitBtn">Submit</button>

答案 1 :(得分:0)

将查询限制为1,并按app.use(flash());对结果进行排序。这样就不必返回整个表格内容。

答案 2 :(得分:0)

如果您想优化查询,explain总是很好,它计划确定问题是什么。我猜,是呼号字段缺少索引。 您使用LIKE运算符,因此您可能需要使用full text indexDISTINCT在此查询中看起来不是必需的,因为您在子查询中已经有GROUP BY