如何使搜索结果更快?

nwlls2ji  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(390)

我用人搜索代码,它的工作,但我得到的搜索结果,这是非常缓慢的希望有人在这里可以做得比我更好,请给反馈。我会把代码写下来的。
这是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;
?>
g0czyy6m

g0czyy6m1#

您搜索的所有数据库字段是否都已正确索引?
您真的需要两个数据集(assoc和numbered)吗。如果没有,只切换到assoc。

$row = mysqli_fetch_assoc($sql)

你能用一个连接代替两个表吗

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'

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

fjnneemd

fjnneemd2#

正如@arkascha所评论的:使用like对性能没有好处。。。也就是说,这里有一些针对您的用例的可能优化。
1) 使用实连接

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

您希望使用连接,而不是老式的带有where子句的交叉连接;根据您的rdbms和数据,这可能会表现得更好。
2) 使用相关数据类型

AND `u_flag`!='0'

您正在比较字符串,但看起来u\u标志应该是一个数字字段,可能是一个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";

相关问题