即使使用 where 子句,“SELECT COUNT(*)”也很慢

2024-03-08

我试图弄清楚如何优化 MySQL 中非常慢的查询(我没有设计这个):

SELECT COUNT(*) FROM change_event me WHERE change_event_id > '1212281603783391';
+----------+
| COUNT(*) |
+----------+
|  3224022 |
+----------+
1 row in set (1 min 0.16 sec)

将其与完整计数进行比较:

select count(*) from change_event;
+----------+
| count(*) |
+----------+
|  6069102 |
+----------+
1 row in set (4.21 sec)

解释语句在这里对我没有帮助:

 explain SELECT COUNT(*) FROM change_event me WHERE change_event_id > '1212281603783391'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: me
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: NULL
         rows: 4120213
        Extra: Using where; Using index
1 row in set (0.00 sec)

好吧,它仍然认为需要大约 400 万个条目来计数,但我可以比这更快地计算文件中的行数!我不明白为什么MySQL要花这么长时间。

这是表定义:

CREATE TABLE `change_event` (
  `change_event_id` bigint(20) NOT NULL default '0',
  `timestamp` datetime NOT NULL,
  `change_type` enum('create','update','delete','noop') default NULL,
  `changed_object_type` enum('Brand','Broadcast','Episode','OnDemand') NOT NULL,
  `changed_object_id` varchar(255) default NULL,
  `changed_object_modified` datetime NOT NULL default '1000-01-01 00:00:00',
  `modified` datetime NOT NULL default '1000-01-01 00:00:00',
  `created` datetime NOT NULL default '1000-01-01 00:00:00',
  `pid` char(15) default NULL,
  `episode_pid` char(15) default NULL,
  `import_id` int(11) NOT NULL,
  `status` enum('success','failure') NOT NULL,
  `xml_diff` text,
  `node_digest` char(32) default NULL,
  PRIMARY KEY  (`change_event_id`),
  KEY `idx_change_events_changed_object_id` (`changed_object_id`),
  KEY `idx_change_events_episode_pid` (`episode_pid`),
  KEY `fk_import_id` (`import_id`),
  KEY `idx_change_event_timestamp_ce_id` (`timestamp`,`change_event_id`),
  KEY `idx_change_event_status` (`status`),
  CONSTRAINT `fk_change_event_import` FOREIGN KEY (`import_id`) REFERENCES `import` (`import_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Version:

$ mysql --version
mysql  Ver 14.12 Distrib 5.0.37, for pc-solaris2.8 (i386) using readline 5.0

我有什么明显遗漏的东西吗? (是的,我已经尝试过“SELECT COUNT(change_event_id)”,但没有性能差异)。


InnoDB 使用聚集主键,因此主键与数据页中的行一起存储,而不是单独的索引页中。为了进行范围扫描,您仍然必须扫描数据页中所有可能较宽的行;请注意,该表包含一个 TEXT 列。

我会尝试两件事:

  1. run optimize table。这将确保数据页按排序顺序物理存储。可以想象,这可以加快集群主键上的范围扫描速度。
  2. 仅在change_event_id 列上创建额外的非主索引。这将在索引页中存储该列的副本,扫描速度要快得多。创建后,检查解释计划以确保它使用新索引。

(您可能还希望将change_event_id列设置为bigintunsigned如果它从零开始递增)

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

即使使用 where 子句,“SELECT COUNT(*)”也很慢 的相关文章

  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • 如何使用 AJAX/jQuery 显示打印内容?

    所以我试图理解整个 AJAX jQuery 的事情 现在 当我单独运行这个 PHP 脚本时 我必须等待并观察轮子旋转 直到循环完成然后加载 while row mysql fetch array res postcode to storm
  • 大数组上的 SSE 性能较慢

    我是 SSE 编程新手 所以我希望有人可以帮助我 我最近使用 GCC SSE 内在函数实现了一个函数来计算 32 位整数数组的总和 下面给出了我的实现代码 int ssum const int d unsigned int len stat
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • 数据库级别的别名列名 [MySQL]

    别名 可能是错误的词 因为它是在将列 表名称作为查询中的其他名称引用的上下文中使用的 我感兴趣的是是否有一种方法可以在数据库中为列指定两个名称 如果我要打印这样的表格 它看起来会是这样的 mysql gt SELECT FROM User
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • IN 子查询中的 GROUP_CONCAT

    SELECT A id A title FROM table as A WHERE A active 1 AND A id IN SELECT GROUP CONCAT B id from B where user 3 如果我启动子查询SE
  • php无法在docker-compose中连接到mysql

    这是我的 docker compose version 2 services nginx image nginx 1 11 8 alpine ports 8081 80 volumes code usr share nginx html h
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 如何获取knex / mysql中所有更新记录的列表

    这是我正在处理的查询 return knex table returning id where boolean false andWhere fooID foo id update boolean true limit num then f
  • 我应该如何审核 MySQL 表中的更改(使用 MySQL 4)?

    我被要求审核 MySQL 表中的任何 所有更改 有谁知道有什么工具可以帮助我做到这一点 还是我需要编写自己的解决方案 如果我编写自己的审计 我最初的想法是制作一个单独的表并在 PHP 代码中构建一系列更改 类似 fieldname1 gt
  • 如何从 MySQL 中的布尔类型返回不同的字符串?

    如果我在 MySql 中将一列设置为布尔值 则查询将返回以下值 0 or 1 是否可以做这样的事情 SELECT bool value AS yes OR no 我的意思是 根据真假返回两个不同的字符串 SELECT CASE WHEN b
  • 降低Python中的浮点精度以提高性能[重复]

    这个问题在这里已经有答案了 我正在树莓派上使用 python 我使用互补滤波器从陀螺仪中获得更好的值 但它消耗了太多树莓派的电量 大约为 70 我认为可以通过降低浮点精度来提高性能 现在 结果大约有 12 位小数 这超出了我的需要 有什么办
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • 如何编写可以补偿拼写错误数据的 MySQL 搜索?

    有没有什么方法可以编写一个 MySQL 搜索来弥补用户在拼写等方面的错误 作为随机示例 有人可能会输入 电子邮件受保护 cdn cgi l email protection代替 电子邮件受保护 cdn cgi l email protect
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别

随机推荐

  • WordPress pre_get_posts 和 date_query

    我正在尝试使用 pre get posts 挂钩来更改年度存档结果 以便它显示整个学年的帖子 我使用的是 WordPress 版本 3 9 2 function get posts by academic year query if que
  • 如何通过revit API访问所有族类型?

    是否可以使用 Revit API 访问特定类别 例如窗户 门等 的所有族类型 与实例相反 据我所知 使用 FilteredElementCollector doc OfCategory ToElements 或 FilteredElemen
  • 根据输入字段的值更改文本颜色或背景[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Javascript 更改背景颜色 https stackoverflow com questions 197748 how do i change the background color
  • CQRS - 如何对场景执行系统进行建模

    我最近开始为我即将启动的一个绿地项目研究 CQRS 和 DDD 我研究了 Udi Dahan Greg Young Mark Nijhof 等人的大量资料 这些确实非常有帮助 我想我对这些概念有了很好的理解 但是 我仍然有一些关于如何将这些
  • Android:如何将 ActionBar“Home”图标更改为应用程序图标以外的其他图标?

    我的应用程序的主图标在一张图像中由两部分组成 一个徽标和其下方的几个字母 这对于应用程序的启动器图标效果很好 但是当图标出现在 ActionBar 的左边缘时 字母会被切断 看起来不太好 我想为 ActionBar 提供一个单独版本的图标
  • 笨拙地计算一组递增数字之间的差异,有更漂亮的方法吗?

    下面的代码工作得很好 但看起来很冗长 肯定有更优雅的方法来计算这个吗 我的想法是 我有一个包含 100 个递增时间戳的列表 我想查看这些时间戳并计算每个时间戳之间的平均时间 下面的代码可以运行 但我确信像这样反转列表确实效率很低 有什么建议
  • 替换除正数/负数之外的所有内容

    对于替换所有正数 许多问题已经得到解答 但是 我找不到任何保留正数和负数的答案 我想替换所有非数字 正数或负数 的内容 输出应如下所示 例如 0 success id 1234 gt 0 1234 and 10 failure id 234
  • Composer 从同一存储库上的另一个分支拉取依赖项

    我有以下 Composer 1 6 5 设置 require CRMPicco GolfBundle dev golf bundle repositories type git url email protected cdn cgi l e
  • 使用 VB.NET 的秒表循环

    我想使用 VB NET 创建一个带有此接口的简单计时器 我想按 Button1 并开始在文本框中计算秒数 我不想使用计时器组件 因为它不提供高分辨率 https stackoverflow com questions 10470276 my
  • 如何使用Content Provider实现复杂的查询?

    我问这个问题是因为我不太确定如何与 Android 内容提供商合作 我的数据库子集包含 8 个表 我需要创建复杂的查询来获取一些数据 我的内容提供程序可以很好地处理简单的查询 例如 我的表上有一个 PersonPersonModel jav
  • 检查 JavaScript 中的全局属性/函数是否已被覆盖

    JavaScript 可以轻松覆盖全局对象的属性和函数 我想找到一种方法来检查全局属性的原始版本是否已被替换 考虑有人将其放入 HTML 中 如果 myscript js 在某处调用encodeURIComponent 函数 它现在的行为将
  • 将 XX:XX AM/PM 转换为 24 小时制

    我搜索过谷歌 但找不到如何获取字符串 xx xx 上午 下午 例如下午 3 30 并将其更改为现在的 24 小时 例如 前一个时间是 15 30 我研究过简单地使用 if then 语句来操作字符串 但它看起来非常乏味 有什么简单的方法可以
  • 覆盖 Spring 表单错误消息

    在 Spring 中如何覆盖默认表单错误消息 我正在使用一个Validator和一个属性文件来添加我自己的错误消息 但是 例如 如何覆盖因转换 编码错误而打印的消息 它们似乎是自动生成的 我认为对用户没有帮助 Failed to conve
  • 如何优化查找相关性的极其缓慢的 MySQL 查询

    我有一个非常慢 通常接近 60 秒 的 MySQL 查询 它试图找到用户对一项民意调查的投票方式与他们对所有先前民意调查的投票方式之间的相关性 基本上 我们收集在给定民意调查中投票给某一特定选项的每个人的用户 ID 然后 我们查看该小组如何
  • 打开 dired 并选择与前一个缓冲区关联的文件?

    假设我正在编辑blah txt使用 Emacs 我决定打开dired以重命名文件 https stackoverflow com questions 384284 can i rename an open file in emacs 384
  • 如何使用 RxJS 对数据变化做出“反应”?

    RxJS 初学者 我在使用 RxJS 保存和跟踪数据更改时遇到问题 假设我在小视图 小部件中构建我的应用程序 每个视图 小部件都有自己的状态 并且应该对数据更改执行操作 我怎么做 更具体的例子 假设我有一个名为Widget and Widg
  • Autofac 和 Quartz.Net 集成

    有没有人有整合经验autofac and 石英网 如果是这样 最好在哪里控制生命周期管理 IJobFactory IJob 的执行中还是通过事件侦听器 现在 我正在使用自定义 autofacIJobFactory来创建IJob实例 但我没有
  • 在新门户中为辅助角色配置远程桌面

    我在新的 Windows Azure 门户中配置远程桌面连接时遇到问题 创建了一个新的工人角色 配置了远程桌面连接的过期时间 导出并上传生成的证书 发布了工作者角色 在新的 Windows Azure 门户 manage windowsaz
  • ASP.NET C# - 在服务器上保存文件流

    我有初学者的问题 如何将文件流保存到服务器上的文件 我懂了 var source Request QueryString src WebClient webclient new WebClient using Stream stream w
  • 即使使用 where 子句,“SELECT COUNT(*)”也很慢

    我试图弄清楚如何优化 MySQL 中非常慢的查询 我没有设计这个 SELECT COUNT FROM change event me WHERE change event id gt 1212281603783391 COUNT 32240