通过连接查询大型数据集(15+ 百万行)

2024-01-12

我正在尝试连接两个表,products and products_markets. While products记录不足一百万条,product_markets接近2000万条记录。数据已更改,因此架构创建表中可能存在一两个拼写错误:

CREATE TABLE `products_markets` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(10) unsigned NOT NULL,
  `country_code_id` int(10) unsigned NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_index` (`product_id`,`country_code_id`)
) ENGINE=InnoDB AUTO_INCREMENT=21052102 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `manufacturer_id` int(10) unsigned NOT NULL,
  `department_id` int(10) unsigned NOT NULL,
  `code` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `popularity` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `value` bigint(20) unsigned NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `products_code_unique` (`code`),
  KEY `products_department_id_foreign` (`department_id`),
  KEY `products_manufacturer_id_foreign` (`manufacturer_id`),
  CONSTRAINT `products_department_id_foreign`
       FOREIGN KEY (`department_id`) REFERENCES `departments` (`id`),
  CONSTRAINT `products_manufacturer_id_foreign`
       FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturers` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=731563 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我正在尝试返回特定国家/地区最受欢迎的产品的 50 条记录,但我遇到的时间大约为 50 秒,这似乎比预期要高。

我尝试了一些不同的查询但没有成功:

select  `products_markets`.`product_id`
    from  products_markets
    left join  
        ( SELECT  products.id, products.popularity
            from  products
        ) p  ON p.id = products_markets.product_id
    where products_markets.country_code_id = 121
    order by  `popularity` desc, `p`.`id` asc
    limit  50 

and

select  `products`.*
    from  `products`
    where  products.id in (
        SELECT  product_id
            from  products_markets
            where  products_markets.country_code_id = 121
                          )
    group by  `products`.`name`, `products`.`manufacturer_id`
    order by  `popularity` desc, `products`.`id` asc
    limit  50 

这个查询的解释是:

id  select_type  table              type possible_keys key           key_len refs             rows              extra
1   PRIMARY      products           ALL  PRIMARY       NULL          NULL    NULL             623848            Using temporary; Using filesort
1   PRIMARY      products_markets   ref  unique_index  unique_index  4       main.products.id 14                Using where; Using index; FirstMatch(products)

我感兴趣的一个选择是将 products_markets 分成每个国家/地区的单独表,以减少查询。我尝试向服务器添加更多内存,但没有成功。任何人都可以识别出数据库设计/查询中存在明显错误的地方吗?

还有哪些其他选项可以使此查询缩短到当前约 50 秒的一小部分?


摆脱id in products_markets and add

PRIMARY KEY(country_code_id, product_id)

然后摆脱UNIQUEkey,除非其他查询需要它。

这将显着缩小该大表的磁盘占用空间,从而可能加快涉及该表的所有查询的速度。

这将有助于哈马扎建议的重新制定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过连接查询大型数据集(15+ 百万行) 的相关文章

  • 维护/更新mysql中的记录顺序

    我在 mySql 中有一个记录表 我需要按照用户指定的方式维护它们的订单 所以我添加了一个 位置 列 当我移动特定记录时更新所有记录的 SQL 语句是什么 我有类似的东西 UPDATE items SET position 2 WHERE
  • 外键和索引

    我有 2 张桌子 products and 类别 每个类别有很多产品 一个产品可以属于多个类别 products product id int primary auto increment name unique etc 类别 catego
  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 为什么我在 MySQL 中设置更大的 INT 数据类型长度时没有收到错误消息?

    我对 MySql 中的数据类型长度有点困惑 我阅读了参考手册http dev mysql com doc refman 5 0 en data types html http dev mysql com doc refman 5 0 en
  • MySQL - 选择一行 - 然后相对于所选行的下一个和上一个

    我会尽力澄清这一点 我需要在不使用 id 的情况下选择特定行和该选定行的前一个相对行以及该选定行的下一个相对行 这可能吗 简而言之 上一篇和下一篇 我不能 也许我只是不知道如何 使用 id 的原因是因为它们不是按顺序排列的 正如您从这个相当
  • “pdo_mysql”已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

    pdo mysql 已禁用 我无法启用它 我在 iMac 7 1 OSX 10 6 8 上安装了 MAMP v 3 0 4 在我的 phpinfo 页面上 我可以看到唯一启用的 PDO 是 sqlite 如果我查看 php 5 5 10 扩
  • 无法连接到 Node.js 上的 MySQL 数据库

    我仍然不明白为什么在尝试连接到 Node js 上的 MYSQL Server 时仍然收到此错误消息 ERROR Error ER ACCESS DENIED ERROR Access denied for user root localh
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • 从 Grib 天气模型中提取数据

    我已经下载了grib1模型数据来自GFS http en wikipedia org wiki Global Forecast System 我使用的是 Mac OS X 并且能够构建wgrib2文件来自NOAA http en wikip
  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • 无法在 Zend Framework 中回滚事务

    我在 Zend Framework 中使用以下代码进行事务 但回滚功能不起作用 数据通过 insertSome data 插入数据库 怎么了 db gt beginTransaction try model gt insertSome da
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • MySql 视图脚本中的注释

    可以这样做吗 我尝试过多个 gui mysql workbench navicat toad for mysql 但没有一个保存这样的注释 something important select something else importan
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in

随机推荐

  • C++ 领域特定嵌入式语言运算符

    在面向数值的语言 Matlab Fortran 中 范围运算符和语义在处理多维数据时非常方便 例如 A i j k n represents two dimensional slice B i j 0 n of A at index k 不
  • Ruby:从大文件中的任意点开始读取

    我有一些日志文件想要筛选 内容正是您在日志文件中所期望的 许多单行逗号分隔的文本 每个文件大约有 4 GB File each line 或 foreach 其中之一大约需要 20 分钟 由于简单的 foreach 看起来 简单 而且慢 我
  • 两个日期之间不同年份的列表

    我想检索两个日期之间不同年份的列表 例如 从25 12 2006 to 14 11 2013 结果应如下所示 2006 2007 2008 2009 2010 2011 2012 2013 这在 SQL Server 中可能吗 像这样的约会
  • 如何登录 Fabrics 发送长消息

    我正在尝试在 Fabrics 系统 Android 上编写长文本日志消息 如下所示 Answers getInstance logCustom new CustomEvent Request requestUrl nResponse jso
  • iPhone开发

    我对 iPhone 开发非常感兴趣 以及如何开始 iPhone 开发 我对 C 没有基本的了解 但我有编程知识和概念 iPhone 开发中心 http developer apple com iphone index action是你的起点
  • 如何使用基于类的addEventListener检索当前元素?

    我正在使用一个函数来检索接收事件的当前元素 在本例中为单击 但我想从 HTML 脚本中删除该函数并使用event listener做同样的事情 但是我正在使用一个类来瞄准元素 如果我只有一个元素 那就很容易了 但事实并非如此 我的第一个想法
  • 在 MVC4 中显示错误,我必须实现一些接口,但我已经完成了

    我正在尝试创建自己的过滤器属性以支持多语言 这个想法很简单 URL 代表语言 http host ext en rest of the url 将以英语打开 并且 http host ext hy rest of the url 将以亚美尼
  • PhpStorm 中的差异

    如何将当前项目中的文档与不属于该项目的文档进行比较 如何使用 phpStorm 比较计算机上的两个任意文件 目前 我发现比较项目文件与非项目文件的最简单方法是将外部文件复制到剪贴板 然后单击 查看 gt 与剪贴板比较
  • PHP 将两个时间变量相加

    在我的 PHP 应用程序中 我想计算两个时间变量的总和 我正在寻找类似这个例子的东西 time1 15 20 00 time2 00 30 00 time time1 time2 如果你期望的答案是15 50 00你想使用strtotime
  • 执行 git reset --hard HEAD^ 后恢复添加/暂存的文件?

    我添加了一个新文件F1并对另一个文件 F2 进行了更改 但随后做了git reset hard HEAD 并且我丢失了对文件的所有更改 有没有some怎么样 我可以把它们找回来吗 我确实在这里看过一个相关问题 如何撤消 git reset
  • 更改函数中的每个 for 循环,以便在每次失败的迭代后自动执行错误处理

    这个问题源于捕获生成器内的错误并随后继续 https stackoverflow com questions 13645112 catch errors within generator and continue afterwards 我有
  • 使用 4 mb 查找不在 40 亿列表中的整数。但 4 MB 还不够[重复]

    这个问题在这里已经有答案了 给定一个包含 40 亿个整数的列表 找到一个不在列表中的整数 使用 4MB 内存 采访是用Java进行的 我的解决方案是使用 BitSet 然而根据我的计算 4 MB 内存中没有足够的位 c 4 MB 4096
  • 标题文本垂直居中

    我希望增加 jquery 移动应用程序标题的大小 当我这样做时 我需要将标题居中 我发现我可以添加一行 line height 30px 到CSS 但这还远远不够 我想一定有更好的方法来做到这一点
  • getSystemService(Context.NSD_SERVICE) 冻结 5.0 模拟器

    尝试执行以下行 NsdManager Mgr NsdManager Ctxt getSystemService Context NSD SERVICE 在 Android 5 0 模拟器 ARMv7a 在 Win64 上 中 模拟器会冻结
  • const_cast 的行为

    我正在阅读有关 C 中的 const cast 运算符的内容 1 我无法理解的第一件奇怪的事情是 const cast 运算符语法 即 const cast 表达式 gt 我对这种语法的理解是 它有助于摆脱常量性expressionof t
  • 这个shell测试达到什么目的

    我有一个非常简单的问题 我无法回答 在 shell 中 这个命令会做什么 test d VIRTUAL ENV virtualenv VIRTUAL ENV 它似乎测试 virtualenv 目录是否存在 但我不明白 if 会如何处理该信息
  • 快速或简洁地确定基于行的数据集合中每列的最长字符串

    从我上次查询的结果 https stackoverflow com questions 2760168 can i set auto width on an open xml sdk generated spreadsheet withou
  • 为什么实现 IObjectSafety 没有带来什么改变?

    我们有一个 activex 对象 它实现了 IObjectSafety 以表明它对于脚本编写是安全的 它从受信任的站点安装 但我们仍然收到 IE 投诉 称该页面上的控件对于脚本编写不安全 运行我们的 activex 的站点管理员不愿意启用未
  • HQL 查询 id 对/元组

    我正在尝试使用 HQL 查询两个域之间新创建的关系 所以我想做类似的事情 select x id y id from Author as x join x books as y where x id y id not in 1 2 3 4
  • 通过连接查询大型数据集(15+ 百万行)

    我正在尝试连接两个表 products and products markets While products记录不足一百万条 product markets接近2000万条记录 数据已更改 因此架构创建表中可能存在一两个拼写错误 CREA