php - 优化 MySQL 全文搜索

标签 php mysql sql full-text-search full-text-indexing

我有一个只有一个字段的搜索,它允许我在 MySQL 表的多个列中进行搜索。

这是 SQL 查询:

SELECT td__user.*
FROM td__user LEFT JOIN td__user_oauth ON td__user.id = td__user_oauth.user_id 
WHERE ( td__user.id LIKE "contact@mywebsite.com" OR (MATCH (email, firstname, lastname) AGAINST (+"contact@mywebsite.com" IN BOOLEAN MODE)) ) 
ORDER BY date_accountcreated DESC LIMIT 20 OFFSET 0

使用 PHP 预处理搜索字段以分隔每个单词的精确 SQL 查询:

if($_POST['search'] == '') {
    $searchId = '%';
} else {
    $searchId = $_POST['search'];
}

$searchMatch = '';
foreach($arrayWords as $word) {
    $searchMatch .= '+"'.$word.'" ';
}

$sqlSearch = $dataBase->prepare('SELECT td__user.*,
                                        td__user_oauth.facebook_id, td__user_oauth.google_id
                                 FROM td__user
                                 LEFT JOIN td__user_oauth ON td__user.id = td__user_oauth.user_id
                                 WHERE (
                                         td__user.id LIKE :id OR 
                                         (MATCH (email, firstname, lastname) AGAINST (:match IN BOOLEAN MODE)) ) 

                                 ORDER BY date_accountcreated DESC LIMIT 20 OFFSET 0);

$sqlSearch->execute(['id'    => $searchId,
                     'match' => $searchMatch]);

$searchResult = $sqlSearch->fetchAll();
$sqlSearch->closeCursor();

这些是我的索引:enter image description here

SQL 查询运行良好,当我在搜索字段中输入 ID 或名字或姓氏,或者电子邮件甚至不完整时,我都会得到结果。我还可以在我的搜索字段中输入名字和姓氏,我只会搜索到具有此名字的人。

另一方面,在包含 500,000 个联系人的表中,查询需要超过 5 秒。为了加快查询速度,在查询或索引方面是否有任何可能的改进点?

最佳答案

您是否尝试在“WHERE”子句中使用“UNION”2 组结果而不是使用“OR”运算符?因为我就是怕索引不能用“或”运算符。

查询将是这样的:

SELECT td__user.*,
    td__user_oauth.facebook_id, 
    td__user_oauth.google_id
FROM td__user
LEFT JOIN td__user_oauth ON td__user.id = td__user_oauth.user_id
WHERE td__user.id LIKE :id

UNION
SELECT td__user.*,
    td__user_oauth.facebook_id, 
    td__user_oauth.google_id
FROM td__user
LEFT JOIN td__user_oauth ON td__user.id = td__user_oauth.user_id
WHERE MATCH (email, firstname, lastname) AGAINST (:match IN BOOLEAN MODE))

ORDER BY date_accountcreated DESC LIMIT 20 OFFSET 0

希望对您有所帮助!

关于php - 优化 MySQL 全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58446456/

相关文章:

java - 从 Java 发送 POST 和 FILE 数据

mysql - 简单的mysql数据库

sql - 选择更新等待是否会永久锁定行?

mysql - (My)SQL 数据库的层次结构

php - 如何在另一个字符串中插入一个字符串?

php - 使用查询创建高级搜索的问题

PHP MYSQL 从行返回

php - MySQL中如何选取空记录

python - sqlalchemy 如何在 OR 操作中使用 AND?

PHP/MySQL : Login form doesn't work