使用 MySQL 提高数据库查询速度


increase speed of database query with mysql

我有以下查询用于预先键入搜索(当您键入表单时,它会在下拉列表中显示匹配项)。 这个查询运行良好,直到我切换到一个包含大约一百万条记录的数据库。 现在需要 15 秒才能显示匹配项。由于搜索命中会在您键入时显示,因此查询位于循环内。 此查询有什么可以更改以加快速度的吗?

$diagnosis = isset($_GET['diagnosis']) ? $_GET['diagnosis'] : '';
$data = array();
if ($diagnosis) {
$query = explode(' ', $diagnosis);
for ($i = 0, $c = count($query); $i < $c; $i ++) {
    $query[$i] = '+' . mysql_real_escape_string($query[$i]) . '*';
}
$query = implode(' ', $query);
$sql = "SELECT diagnosis, icd9, MATCH(diagnosis) AGAINST('$query' IN BOOLEAN MODE) AS relevance 
        FROM icd10 WHERE MATCH(diagnosis) AGAINST('$query' IN BOOLEAN MODE) HAVING relevance > 0 ORDER BY relevance ";
$r = mysql_query($sql);
    while ($row = mysql_fetch_array($r)) {
        $data[] = $row;
    }
}
echo json_encode($data);
exit;

你可以尝试一些东西:

首先,确保您有 diagnosis 的全文索引。其次,确保您有diagnosis的全文索引!一百万行并不多(当然取决于diagnosis中的字数),所以这可能已经是问题所在。

然后尝试以下代码:

SELECT diagnosis, icd9, MATCH(diagnosis) AGAINST('$query' IN BOOLEAN MODE) AS relevance 
FROM icd10 ORDER BY relevance desc limit 30

(这可能不是很明显,它更快,也可能不是,所以试试吧)。

如果您需要支持短词,例如,如果经常输入 3 位 icd9 代码,您应该检查您的ft_min_word_len/innodb_ft_min_token_size值(取决于您的数据库)以确保它们包含在索引中 - 但请注意,这将增加您的索引大小。也许检查停用词。

没有指定您的设置;您通常可以通过更改设置、hdd 或 ram 来提高一般数据库性能。尤其是公羊。

一些常规想法:您可能希望异步调用函数(用户应该能够在查询运行时键入)。一旦你达到少于 30 个结果(或你设置的任何限制),你就可以在 php 中即时过滤剩余的结果(只要查询变得更长/没有删除任何单词) - 这是你最接近缓存的。或者将限制设置为 1000 并在之后手动过滤,php 正则表达式也很快,您只需要一个分数函数。根据您的数据,当您只向查询添加一个字母时,您可能不希望运行查询(每个文本都将包含一个以"a"开头的单词,因此您可能不会获得更好的结果 - 尽管"q"可能不是这种情况)。这不会减少查询的运行时间,但您可以只保存一次执行。