0

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

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

我相信我应该要么union对单词做一个,要么可能执行一个包含AND针对所有单词的语句的选择语句。

    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]];
    }

有什么想法吗?

4

1 回答 1

0

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

您正在为每个单词执行一个 sql 语句,您应该尝试将其更改为对所有单词执行一个语句并直接获取结果。这将加快您的查询速度,并可能使您的代码更容易阅读。

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

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

于 2013-07-28T00:10:27.380 回答