php - 提高mysql数据库查询速度

标签 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;

最佳答案

你可以尝试一些东西:

首先,确保您有用于诊断的全文索引。其次,确保您有用于诊断的全文索引!一百万行并不算多(当然取决于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 值(取决于您的数据库)以确保它们包含在索引中 - 但请注意,这会增加您的索引大小。也许检查一下停用词。

您没有指定您的设置;您通常可以通过例如以下方式提高一般数据库性能:更改设置、硬盘或内存。特别是公羊。

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

关于php - 提高mysql数据库查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845090/

相关文章:

php - 如何在不选择所有行的情况下获取行数?

mysql - 仅在 mySQL 查询浏览器中执行行/多行

php - PHP-在MySQL函数中使用HTML表单函数中的变量在另一个函数中查询

php - Rails 对学习 PHP Zend Framework 有帮助吗

c# - mysql 连接错误太多

MongoDB全文搜索+部分单词匹配的解决方法

elasticsearch - Elasticsearch 。 _Score 在聚合中为 null。为什么?

PostgreSQL 重音 + 不区分大小写的搜索

php - 用唯一值更新 MYSQL 中的每一行

mysql - 获取最近 10 分钟数据的唯一值 - mysql