Как сделать результат поиска быстрее? - PullRequest
0 голосов
/ 29 декабря 2018

Я использую код поиска людей, это работает, но я получаю результаты поиска, это очень медленно, надеюсь, кто-то здесь может сделать лучше меня, пожалуйста, дайте отзыв.я прикреплю код вниз.

это код 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-кода

Здесь я использую базу данных и выбираю данные из двух разных таблиц с одинаковым идентификатором пользователя

<?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 голосов
/ 29 декабря 2018

Правильно ли проиндексированы все поля базы данных, в которых вы осуществляете поиск?

Вам действительно нужны оба набора данных (ассоциированные и пронумерованные).Если нет, переключитесь только на привязку.

$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'

И если вам не нужны все поля, ВЫБЕРИТЕ только те поля, которые вам нужны.

0 голосов
/ 29 декабря 2018

Как прокомментировал @arkascha: использование LIKE не является хорошим для производительности ... Как говорится, вот несколько возможных оптимизаций для вашего варианта использования.

1) Использовать реальные JOINы

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

Вы хотите использовать СОЕДИНЕНИЯ вместо перекрестных СОЕДИНЕНИЙ старого стиля с предложением WHERE;в зависимости от вашей РСУБД и данных это может работать лучше.

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";
...