gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:34:27 26 4
gpt4 key购买 nike

我有以下用于预先输入搜索的查询(当您在表单中输入内容时,它会在下拉列表中显示匹配项)。这个查询运行良好,直到我切换到一个包含大约一百万条记录的数据库。现在需要 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com