简单选择查询在具有大数据集10M的mysql表中花费太多时间

时间:2019-06-05 13:28:44

标签: mysql sql laravel mariadb

SELECT *
FROM many_leads_lead_details
WHERE location LIKE '%Los%Angeles%'
  AND (keywords LIKE '%Real%' or
       keywords LIKE '%Real Estate%' or
       keywords LIKE '%Real Estate Agent%')

与本地数据库相比,以上查询花费了太多时间。

需要花费时间的数据库托管在另一台服务器上, 响应时间如下 Localhost = 30.00秒 继续 rds.amazonaws.com = 1.50分钟

$leads2 = LeadDetails::query();
        $temp = '';
        $location = str_replace(' ', '%', explode(',', $campaign->location)[0]);
        $leads2->Where('location', 'like', '%' . $location . '%');
        //dd($leads2->get());
        $leads2->Where(function ($query) use ($campaign, $temp) {
            foreach (explode(' ', $campaign->keywords) as $index => $keyword) {
                if ($index == 0) {
                    $temp .= $keyword;
                } else {
                    $temp .= ' ' . $keyword;
                }
                $query->OrWhere('keywords', 'like', '%' . $temp . '%');
            }
        });
$leads2->get();

enter image description here

enter image description here

4 个答案:

答案 0 :(得分:2)

此查询:

SELECT *
FROM many_leads_lead_details
WHERE location LIKE '%Los%Angeles%'
  AND (keywords LIKE '%Real%' or
       keywords LIKE '%Real Estate%' or
       keywords LIKE '%Real Estate Agent%')

需要全表扫描。由于LIKE模式开头的通配符,因此无法使用索引。

我的第一个建议是修复您的数据模型。我怀疑您在keywords中存储了多个值。这些应该在单独的表中。

第二个建议是使用全文搜索-match()函数。这里的答案太长了。您应该从documentation开始。

答案 1 :(得分:1)

WHERE location LIKE '%Los%Angeles%'
  AND (keywords LIKE '%Real%' or
       keywords LIKE '%Real Estate%' or
       keywords LIKE '%Real Estate Agent%')

->

WHERE MATCH(location, keywords) AGAINST ('Los Angeles Real Estate Agent')

并拥有

FULLTEXT(location, keywords)

这样可以更快地运行很多

答案 2 :(得分:0)

您已经提到本地数据库更快地返回结果。假设两个数据库的数据量相似或相同。

  1. 检查两个服务器中的索引是否具有相同的索引。

  2. 如果索引没有差异,则远程服务器可能使用不同的查询计划。如果发现问题在于表扫描,则可以尝试将行数和页数引入性能调整:

    更新统计信息[many_leads_lead_details] ROWCOUNT = 50000000,PAGECOUNT = 500000

尝试更新统计信息,然后重新运行查询。希望这会有所帮助。

答案 3 :(得分:0)

当您从数据库中选择多条记录并且您不希望与查询返回的记录有关系时,请使用 DB Facade 而不是 eloquent query

当从数据库中选择记录并且不需要表关系时,最好使用 DB Facade 而不是 eloquent