php - 优化MySQL搜索查询

标签 php mysql sql search

我只是尝试对我的网站进行一些小型搜索,以查找用户条目并以逻辑方式对它们进行排序,我尝试改进结果,但最终得到的查询字符串太大,需要 14 秒才能执行在我的服务器上。所以我目前想知道如何优化查询而不会对结果进行任何更大的更改。

这是我当前的查询:

$query = "SELECT * FROM(
    SELECT 1 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE title LIKE '".$search."'
            union all
    SELECT 2 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE title LIKE '".$search."%'
        OR title LIKE '%".$search."'
            union all
    SELECT 3 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE title LIKE '%".$search."%'
            union all
    SELECT 4 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE keywords LIKE '".$search."'
            union all
    SELECT 5 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE keywords LIKE '%".$search."'
        OR keywords LIKE '".$search."%'
            union all
    SELECT 6 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE keywords LIKE '%".$search."%'
            union all
    SELECT 7 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE content LIKE '".$search."'
            union all
    SELECT 8 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE content LIKE '%".$search."'
        OR content LIKE '".$search."%'
            union all
    SELECT 9 as m_rank,title,rank, content, url, keywords FROM websites
        WHERE content LIKE '%".$search."%'
    ) a
    ORDER BY m_rank, rank DESC LIMIT ".$page.", ".$max;

是否还可以使用 PHP 来削减查询以进行预处理?

最佳答案

您可以通过一个查询来完成此操作。将不同的搜索条件放在一个case中以分配m_rank。像这样的东西:

SELECT title, rank, content, url, keywords,
       (case when title LIKE '".$search."' then 1
             when title LIKE '".$search."%' OR title LIKE '%".$search."' then 2
             when title LIKE '%".$search."%' then 3
             . . .
             else NULL
        end) as m_rank
FROM websites
HAVING m_rank is not null
ORDER BY m_rank, rank DESC
LIMIT ".$page.", ".$max;

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

相关文章:

php - cakephp hasmany查询问题

php - Laravel MySQL 无法在可为空的外键中插入空值

php - Medoo SQL IN 或类似功能

sql - 获取查询行号

mysql - 从表中选择具有最新时间戳的行的 JOOQ 代码

sql - 向表中插入一行的日期

php - 在 MySQL 中使用 Group BY 获取行

javascript - AJAX $.ajax() 和 setInterval() 仅在有人在页面上时才加载?

php - 在 Doctrine2 实体中存储 "CASE WHEN"条件

php - 拆分字符串以放入 CodeIgniter Active Record SQL 查询中