Ajax搜索逻辑需要改进

时间:2013-07-27 22:03:36

标签: php sql ajax

我的ajax搜索查询响应速度慢(2秒)。我相信这与我的逻辑有关。这是我的逻辑描述:

  • 用户输入单词的排列。
  • 在我的代码中,我将字符串拆分为单独的单词。
  • 对于每个单词,我运行一个查询,选择包含该单词的数据。我正在使用LIKE语句,因为我正在尝试查找包含单词的数据。
  • 最后,我对数据集执行array_intersect,只留下包含查询中所有单词的结果。
  • 我立即发送了json回复。

我认为我应该对这些词进行union,或者执行一个包含针对所有单词的AND语句的select语句。

    foreach($searchParts as $part){
        $sql="SELECT contacts.id AS contactid
        FROM contacts   
        WHERE contacts.addressbook_id =$addressBookId AND";
        $sql.="(contacts.firstname LIKE '%".$part."%' OR ";
        $sql.="contacts.middlename LIKE '%".$part."%' OR ";
        $sql.="contacts.lastname LIKE '%".$part."%' OR ";
        $sql.="contacts.primary_emailaddress LIKE '%".$part."%' OR ";
        $sql.="contacts.alternate_emailaddress LIKE '%".$part."%' OR ";
        //$sql.="contacts.gender LIKE '%".$part."%' OR ";
        $sql.="contacts.personal_address_line1 LIKE '%".$part."%' OR ";
        $sql.="contacts.personal_address_line2 LIKE '%".$part."%' OR ";
        $sql.="contacts.personal_address_city LIKE '%".$part."%' OR ";
        $sql.="contacts.personal_address_zipcode LIKE '%".$part."%' OR ";
        $sql.="contacts.company_name LIKE '%".$part."%' OR ";
        $sql.="contacts.company_position LIKE '%".$part."%' OR ";
        $sql.="contacts.company_address_line1 LIKE '%".$part."%' OR ";
        $sql.="contacts.company_address_line2 LIKE '%".$part."%' OR ";
        $sql.="contacts.company_address_city LIKE '%".$part."%' OR ";
        $sql.="contacts.company_address_zipcode LIKE '%".$part."%' OR ";
        $sql.="contacts.home_phonenumber LIKE '%".$part."%' OR ";
        $sql.="contacts.company_phonenumber LIKE '%".$part."%' OR ";
        $sql.="contacts.cell_phonenumber LIKE '%".$part."%' OR ";
        $sql.="contacts.birthday_month LIKE '%".$part."%' OR ";
        $sql.="contacts.birthday_day LIKE '%".$part."%' OR ";
        $sql.="contacts.birthday_year LIKE '%".$part."%' OR ";
        $sql.="contacts.facebook_username LIKE '%".$part."%' OR ";
        $sql.="contacts.twitter_username LIKE '%".$part."%' OR ";
        $sql.="contacts.googleplus_username LIKE '%".$part."%' OR ";
        $sql.="contacts.linkedin_username LIKE '%".$part."%' OR ";
        $sql.="contacts.personal_website_url LIKE '%".$part."%')";
        $sql.=" ORDER BY contacts.date_created DESC";
        $result=mysql_query($sql,$dbh);
        if($result && mysql_num_rows($result)){
            while(($row=mysql_fetch_assoc($result))!==false){
                $tmpArr[$part][]=$row['contactid'];
            }
        }
    }
    foreach($tmpArr as $part => $data){
        $tmpArr[$part] = array_unique($tmpArr[$part]);
    }
    if(count($tmpArr)>1){
        $tmpArr = array_values(call_user_func_array("array_intersect", $tmpArr));
    } else {
        $tmpArr = $tmpArr[$searchParts[0]];
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我的建议是对包含字符(如varchars)的列以及INT值的REGEXP功能使用全文搜索。

你正在为每个单词执行一个sql语句,你应该尝试改变它来为所有单词执行一个单一的语句 并直接得到结果。这样可以加快查询速度,并且可以让您更轻松地阅读代码。

您还应该考虑使用PDO或mysqli而不是mysql_ *函数,因为不推荐使用mysql_ *函数。

如果您需要更多帮助,请告诉: - )