我使用人员搜索代码可以正常工作,但是我得到的搜索结果非常慢,希望这里有人可以做得比我好,请提供反馈。我会把代码附加下来。
这是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;
?>
答案 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'
如果您不需要所有字段,请仅选择所需的字段。