如何使搜索结果更快?

时间:2018-12-29 10:53:59

标签: php jquery mysql search-engine

我使用人员搜索代码可以正常工作,但是我得到的搜索结果非常慢,希望这里有人可以做得比我好,请提供反馈。我会把代码附加下来。

这是Javascript代码。

<script>
    function lightbg_clr() {
        $('#qu').val("");
        $('#textbox-clr').text("");
        // $('#search-layer').css({"width":"30%"});
        // $('#livesearch').css({"display":"none"});
        $("#qu").focus();
    };

    function fx(str)
    {
        var s1=document.getElementById("qu").value;
        var xmlhttp;
        if (str.length==0) {
            document.getElementById("livesearch").innerHTML="";
            // document.getElementById("livesearch").style.border="0px";
            // document.getElementById("search-layer").style.width="auto";
            // document.getElementById("search-layer").style.height="auto";
            // document.getElementById("livesearch").style.display="block";
            $('#textbox-clr').text("");
            return;
        }
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("livesearch").innerHTML=xmlhttp.responseText;
                // document.getElementById("search-layer").style.width="50%";
                // document.getElementById("search-layer").style.height="50%";
                // document.getElementById("livesearch").style.display="block";
                $('#textbox-clr').text("X");
            }
        }
        xmlhttp.open("GET","../validate/call_ajax.php?n="+s1,true);
        xmlhttp.send();
    }
</script>

这是我的HTML代码

<div class="bk">
<input type="text" onKeyUp="fx(this.value)" autocomplete="on" name="qu" id="qu" class="textbox" placeholder="What are you looking for ?" tabindex="1">
<button type="submit" class="query-submit" tabindex="2"><i class="fa fa-search" style="color:#001150; font-size:20px"></i></button>
<div id="livesearch"></div>
</div>

这是在获取PHP代码

这里我正在使用数据库并从具有相同用户ID的两个不同表中获取数据

<?php
include('../db/mySqlDBi.class.php');
$dbConn = new mySqlDB();

$s1=$_REQUEST["n"];

$select_query=
    "SELECT * 
      FROM u_info_one as uio, u_info_two as uit 
      WHERE
        uio.u_id=uit.u_id 
        AND u_fname LIKE '%".$s1."%' 
        AND uio.`u_id`!='{$_SESSION["u_id"]}' 
        AND `u_flag`!='0'";
$sql=$dbConn->selector($select_query);
$s="";
while($row=mysqli_fetch_array($sql))
{
    $s=$s."
    <a class='link-p-colr' href='user-profile.php?user_id=".$row['u_id']."'>
        <div class='live-outer'>
                <div class='live-im'>";

                        if($row['u_image']!="") {

                       $s=$s."<img src='".$row['u_image']."' alt=\"\">";

                        }else {
                                $s=$s."<img src=\"../images/male-avatar1.png\" alt=\"\">";
                        }

    $s=$s."</div>
                <div class='live-product-det'>
                    <div class='live-product-name'>
                        <p>".$row['u_fname']." ".$row['u_lname']."</p>
                    </div>
                </div>
        </div>
    </a>
    ";
}
echo $s;
?>

2 个答案:

答案 0 :(得分:0)

如@arkascha所评论:使用LIKE不利于性能...话虽如此,这是针对您的用例的一些可能的优化。

1)使用真实的联接

FROM u_info_one as uio, u_info_two as uit 
 WHERE
     uio.u_id=uit.u_id 

您要使用JOIN而不是带有WHERE子句的旧式交叉JOIN;根据您的RDBMS和数据,这可能会更好。

2)使用相关数据类型

AND `u_flag`!='0'

您正在比较字符串,但是看起来u_flag应该是一个数字字段,也许是TINYINT(1)。较小的数据类型使搜索速度更快,并且比较数字通常比字符串更有效。检查表中此字段的定义。

3)为您的搜索条件编制索引

您要在两个表中搜索的列都建立索引。我不能确切地说出哪些列属于哪个表,因为不是所有的标识符都被引用,但是每个表一个索引(也许是复合索引)应该很好,例如:

CREATE INDEX idx_info_one ON info_one(u_fname, u_flag);

这是您更新的查询:

$select_query=
    "SELECT * 
      FROM 
          u_info_one as uio
          INNER JOIN u_info_two as uit 
              ON uio.u_id=uit.u_id
      WHERE
        u_fname LIKE '%".$s1."%' 
        AND uio.`u_id`!='{$_SESSION["u_id"]}' 
        AND `u_flag`!=0";

答案 1 :(得分:0)

您搜索的所有数据库字段都正确索引了吗?

您真的需要两个数据集(关联和编号)。如果不是,请仅切换为assoc。

$row = mysqli_fetch_assoc($sql)

您可以使用JOIN代替两个表吗?

SELECT * 
FROM u_info_one as uio
LEFT JOIN u_info_two as uit
ON (uio.u_id = uit.u_id) 
WHERE
    u_fname LIKE '%".$s1."%' 
    AND uio.`u_id`!='{$_SESSION["u_id"]}' 
    AND `u_flag`!='0'

如果您不需要所有字段,请仅选择所需的字段。