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

标签 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%')

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

数据库占用时间托管在另一台服务器上, 响应时间如下 本地主机 = 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

最佳答案

此查询:

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 模式开头存在通配符,因此无法使用索引。

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

第二个建议是使用全文搜索——match() 函数。这个话题太长了,无法在这里回答。您应该从 documentation 开始.

关于mysql - 简单的选择查询在具有大数据集 10M 的 mysql 表中花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56461470/

相关文章:

mysql 继承位置方案

python - 一次从临时表中获取n条记录

php - laravel join 查询为两个不同的数据返回两个相同的 id

mysql - 硬重启后 Mariadb 无法启动

MySQL查询

mysql - 用于 mahout 推荐的内存数据库

sql - 如何获得符合 PostgreSQL 标准的行的百分比?

mysql - 如何向外键插入空值?

php - 如何解决 BadMethodCallException,调用未定义的方法 Illuminate\Database\Query\Builder::filter()

php - 我正在尝试过滤仅分配给主页类别的帖子(Laravel)