我只是尝试对我的网站进行一些小型搜索,以查找用户条目并以逻辑方式对它们进行排序,我尝试改进结果,但最终得到的查询字符串太大,需要 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/