CodeIgniter加入时间太长但是单独的查询是即时的

时间:2017-05-17 09:16:22

标签: php mysql codeigniter

我正在编写一个能够搜索中型数据库的系统,该数据库检查多个表以进行搜索查询。只是为了让您了解数据库的规模:

客户表

行:13396

Customer_domains表

行:13373

他们是我尝试使用此查询搜索的唯一两个表。

问题

我面临的问题是,通过使用使用joins的查询,加载时间超过2分钟即可完成搜索。

通过运行两个单独的查询并返回它们的组合结果几乎是即时的。

通过运行两个单独的查询而不是连接,我可以在合理的时间范围内获得搜索结果使用此方法我无法正确实现分页,因为有两个单独的查询我可以&# 39;应用一个限制。

所以看来正确的方法是使用连接,但为什么连接的时间比第二次查询要长得多?

我的代码使用连接(执行时间太长)

public function search($searchquery)
    {
        $this->db->select()
        ->from('customers')
        ->join('customer_domains', 'customer_domains.customer_id = customers.customer_id')
        ->like('customers.customer_id', $searchquery, 'both')
        ->or_like('customers.customer_name', $searchquery, 'both')
        ->or_like('customers.business_name', $searchquery, 'both')
        ->or_like('customers.address_line_1', $searchquery, 'both')
        ->or_like('customers.address_line_2', $searchquery, 'both')
        ->or_like('customers.address_line_3', $searchquery, 'both')
        ->or_like('customers.address_line_4', $searchquery, 'both')
        ->or_like('customers.postcode', $searchquery, 'both')
        ->or_like('customers.landline', $searchquery, 'both')
        ->or_like('customers.mobile', $searchquery, 'both')
        ->or_like('customers.email', $searchquery, 'both')
        ->or_like('customer_domains.domain', $searchquery, 'both')
        ->limit(50);
        $query = $this->db->get();

        $result = $query->result();

        return $result;

    }

我的代码包含两个单独的查询(无法分页)

public function search($searchquery)
    {
        $this->db->select()
        ->from('customers')
        ->like('customers.customer_id', $searchquery, 'both')
        ->or_like('customers.customer_name', $searchquery, 'both')
        ->or_like('customers.business_name', $searchquery, 'both')
        ->or_like('customers.address_line_1', $searchquery, 'both')
        ->or_like('customers.address_line_2', $searchquery, 'both')
        ->or_like('customers.address_line_3', $searchquery, 'both')
        ->or_like('customers.address_line_4', $searchquery, 'both')
        ->or_like('customers.postcode', $searchquery, 'both')
        ->or_like('customers.landline', $searchquery, 'both')
        ->or_like('customers.mobile', $searchquery, 'both')
        ->or_like('customers.email', $searchquery, 'both')
        ->limit(50);
        $query = $this->db->get();

        $result = $query->result();

        $this->db->select('')
        ->from('customer_domains')
        ->join('customers', 'customers.customer_id = customer_domains.customer_id', 'left')
        ->like('customer_domains.domain', $searchquery, 'both')
        ->limit(50);
        $query_domains = $this->db->get();

        foreach($query_domains->result() as $query_domain){
            array_push($result, $query_domain);
        }

        return $result;

    }

是否有人有另一个解决方案,或者可以解释为什么优选的连接语句比第二个查询花费的时间长得多,以及如何改进它?谢谢!

1 个答案:

答案 0 :(得分:0)

为了让您更快地查询,您应该从表中添加索引

https://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html