使用mysql提高数据库查询的速度

时间:2016-04-25 15:37:52

标签: php mysql full-text-search

我对提前输入搜索有以下查询(当您在下拉列表中键入显示匹配的表单时)。此查询运行良好,直到我切换到具有大约一百万条记录的数据库。现在需要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;

1 个答案:

答案 0 :(得分:1)

你可以尝试一些东西:

首先,确保您拥有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-values(取决于你的数据库)以确保它们包含在索引中 - 但要注意它会增加你的索引大小。也许检查一下停用词。

您没有指定设置;您通常可以通过例如提高一般数据库性能更改设置,hdds或ram。特别是ram。

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