Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 优化MySQL搜索查询_Php_Mysql_Sql_Search - Fatal编程技术网

Php 优化MySQL搜索查询

Php 优化MySQL搜索查询,php,mysql,sql,search,Php,Mysql,Sql,Search,我只是尝试对我的网站进行一些小搜索,以找到用户条目并以逻辑方式对它们进行排序,我尝试改进结果,但结果是查询字符串太大,需要14秒才能在我的服务器上执行。因此,我现在想知道如何在不改变结果的情况下优化查询 以下是我当前的查询: $query = "SELECT * FROM( SELECT 1 as m_rank,title,rank, content, url, keywords FROM websites WHERE title LIKE '".$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进行预处理来剪切查询?

您可以通过一个查询来完成此操作。将不同的搜索条件放入
案例中
,以分配
m_秩
。比如:

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;

很好-使用
CASE
()比我以前写过的一些
IF
庞然大物要整洁得多:)其他可能的替代方法:
FULLTEXT
搜索()或实现类似ApacheLucene()的东西,而不是RYO解决方案。