【问题标题】:Simple Select Query taking too much time in mysql-table with large data-set 10M简单的选择查询在 mysql-table 中花费太多时间,数据集为 10M
【发布时间】:2019-10-21 00:31:45
【问题描述】:
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();

【问题讨论】:

  • suggestion :> 删除 * 并只输入必填列,这会减少你的时间
  • 桌子有多大?这部分or keywords like '%Real Estate%' or keywords like '%Real Estate Agent%' 也是多余的。
  • @SamuelCook 目前它有 1000 万行以上,它将增加超过 1 亿,我想要包含房地产、房地产和房地产经纪人的相关数据,这就是我添加 keywords like '%Real%' or keywords like '%Real Estate%' or keywords like '%Real Estate Agent%' 的原因跨度>
  • 执行LIKE %...% 不会很快。考虑使用 fulltext 索引或使用弹性搜索等其他搜索提供程序。
  • @SamuelCook 试图说的是:如果关键字类似于“%Real Estate%”,也类似于“%Real%”。从这个意义上说,它是多余的

标签: mysql sql laravel mariadb


【解决方案1】:

这个查询:

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开始。

【讨论】:

    【解决方案2】:
    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)
    

    这会运行得更快很多

    【讨论】:

      【解决方案3】:

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

      1. 检查是否在两台服务器上都有相同的索引。

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

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

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

      【讨论】:

      • 问题是关于 MySQL/MariaDB 的;他们没有这样的UPDATE STATISTICS...
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-02
        • 2022-06-22
        • 2020-11-06
        • 1970-01-01
        • 2018-01-08
        • 2012-09-03
        • 2019-11-14
        • 1970-01-01
        相关资源
        最近更新 更多