为什么索引会使查询变得非常慢?

2024-01-05

有一天我回答了一个question https://stackoverflow.com/questions/5642880/slow-mysql-query/5642908#5642908就这样(被认为是正确的),但答案给我留下了很大的疑问。
不久,用户就有了一个包含以下字段的表:

id INT PRIMARY KEY
dt DATETIME (with an INDEX)
lt DOUBLE

查询SELECT DATE(dt),AVG(lt) FROM table GROUP BY DATE(dt)真的很慢。 我们告诉他(部分)问题在于使用DATE(dt)作为字段和分组,但数据库位于生产服务器上,无法拆分该字段。
所以(用触发器)插入了另一个字段da DATE (with an INDEX)自动填充DATE(dt). Query SELECT da,AVG(lt) FROM table GROUP BY da有点快,但是大约有 800 万条记录,大约需要 60 秒!
我在我的电脑上尝试了一下,最后我发现,删除了字段上的索引da查询只花了7秒,而使用DATE(dt)删除索引后花了13秒。
我一直认为用于分组的列上的索引确实可以加快查询速度,而不是相反(慢 8 倍!!!)。
为什么?到底是哪一个原因呢?
多谢。


因为您仍然需要从索引+数据文件中读取所有数据。由于您没有使用任何where条件 - 您始终会拥有查询计划,该计划可以逐行访问所有数据,并且您对此无能为力。

如果性能对此查询很重要并且经常执行 - 我建议将结果缓存到某个临时表中并每小时(每天等)更新一次。

为什么它变得更慢:因为索引中的数据已经排序,当mysql计算查询执行的成本时,它认为最好使用已经排序的数据,然后对其进行分组,然后计算聚合。但本例并非如此。

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

为什么索引会使查询变得非常慢? 的相关文章

  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 不允许在 php 中连接到此 MariaDB 服务器

    我尝试在 php 中连接远程服务器数据库 但出现以下错误 Host xx xxx xx xx is not allowed to connect to this MariaDB server in 我的连接代码是这样的 servername
  • 连接 Netbeans 和 MySQL 但出现大整数错误

    所以我正在尝试向我的 Netbeans 数据库 即 MySQL 添加新连接 但我遇到了大整数转换错误 有人可以帮助我吗 详细地 我右键单击现有的MySQL 服务器位于 localhost 3306 root 已断开连接 gt gt 选择co
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • Postgres JSONB 字段中的全局替换

    我需要全局替换嵌套 JSON 结构中多个位置出现的特定字符串 该字符串作为 jsonb 存储在 postgres 表中 例如 location tmp config alternate location name config locati
  • 无法使用 BatchNorm 层导入冻结图

    我基于此训练了一个 Keras 模型repo https github com bonlime keras deeplab v3 plus 训练后 我将模型保存为检查点文件 如下所示 sess tf keras backend get se
  • 使用 JQuery(立即)检测对 的所有更改

    价值的体现有多种方式
  • 使用 PowerShell 匹配存储在变量中的字符串

    我正在尝试创建一个备份脚本来移动超过 30 天的文件 但我希望能够从列表中排除文件夹 a C Temp Exclude test b C Temp Exclude 如果我运行以下命令 a match b 下列的 Guy Guy Thomas
  • Select2 使用ajax响应数据生成id

    我的 JSON 响应数据不包含 ID 字段 而 Select2 需要该字段才能显示结果 在文档中 他们提供了一种生成 id 的方法 但是我无法这样做 有人可以提供一个关于如何执行此操作的示例吗 到目前为止我已经尝试过了 itemSearch
  • Net Core 2 中 HandleErrorAttribute 的等效项

    我正在将 Net 4 6 2 项目迁移到 Net Core 2 相当于什么HandleErrorAttribute 第 2 行以下接收错误 public static void RegisterGlobalFilters GlobalFil
  • 在 Java 中使用 volatile 关键字的完整示例?

    我需要一个简单的使用示例volatileJava 中的关键字 由于不使用而导致行为不一致volatile 理论部分volatile用法对我来说已经很清楚了 首先 没有保证由于非易失性变量而暴露缓存的方式 您的 JVM 可能一直对您非常友善
  • 访问VBA:根据非绑定列在组合框中查找项目

    我在 Access 表单上有一个两列组合框 表示键到代码的映射 组合框的第一列是 绑定列 即 当MyComboBox Value叫做 我需要动态设置Value我的组合框基于第二列中找到的值 例如 如果我的组合框源是 Value Code A
  • 蓝牙+模拟鼠标

    有人知道是否可以制作一个应用程序通过蓝牙模拟触摸屏鼠标或触控板 如何使 PC 或 MAC 将我识别为鼠标设备 问候 胡安 您应该查看蓝牙 HID 规范 这可能是可能的 具体取决于您用来模拟鼠标 触控板的设备堆栈 我不熟悉 Android 上
  • 由于错误 800a025e,无法完成操作

    这个错误在 IE10 11 中意味着什么 Error Could not complete the operation due to error 800a025e 我该如何调试它 它说的是这一行 this nativeSelection r
  • TabPanel 中的 gwt ScrollPanel:没有垂直滚动条

    EDIT 我通过调整组件内的大小来修复空白行为VerticalPanel 这似乎对面板尺寸产生了影响 但控制台却忽略了这一点 我不太明白怎么办 但是 我的面板仍然没有显示垂直滚动条 在 GWT 项目中 我具有以下结构 Page DockLa
  • 如何检查我是否有 Base Clearcase 或 UCM?

    我是 ClearCase 的新手 我以前用过理性协同 我们在项目中使用 ClearCase 进行版本控制 在我的旧项目中 我使用了合理的协同作用 其中我们为文件中的任何修改创建 任务 我了解到我们在 ClearCase 中有活动 我想在我们
  • 用于启用/禁用用户的 Firebase 触发器

    在 Firebase Auth 控制台中 每个用户都有一个选项 例如启用 禁用其帐户 如何在 Firebase 函数和 Android 应用程序中触发此事件 函数无法在这种事件上触发 至少现在还没有 函数只会在这些情况下触发 查看doc h
  • Java 中的函数式编程 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Java 有没有一个好的函数式编程库 我正在寻找类似的东西谓词 http msdn microsoft com en us library
  • 读取调制解调器固件版本:Android

    我正在开发一个 iPhone 和 Android 中的应用程序 我需要阅读Modem Firmware Version正如 iPhone 开发人员在他身边所做的那样 我在 Internet SO 上搜索 但找不到与我的问题相关的任何内容 是
  • 在 JUnit5 (Eclipse) 中创建 TestSuite

    我在 eclipse 中创建了多个测试用例 java 文件 JUnit 的版本是 JUnit5 现在 我尝试通过 eclipse GUI 创建 Junit TestSuite 在创建过程中 我没有在可用版本中看到 JUnit5 这是我为创建
  • 浏览器中自动完成下拉菜单的样式

    例如 在许多网站上 当输入用户名时 会在显示先前输入的位置出现一个下拉菜单 以便用户可以轻松选择某些内容而不用输入 我知道您可以通过让表单或输入具有以下属性来在浏览器中关闭此功能autocomplete off 问题是当我想要它打开并且输入
  • 告诉 `endl` 不要刷新

    我的程序打印大量短行cout 作为一个稍微做作的例子 我的线条看起来有点像这样 cout lt lt The variable s value is lt
  • 使用核心数据实体更新表节标题的有效方法?

    我为我的 UITableView 使用 NSFetchedResultsController 它显示了我存储在核心数据中的一堆事件 我想做的是按相对日期 即今天 明天 本周等 对表格进行分组 每个事件都有一个开始日期 我尝试在事件实体中创建
  • 为什么索引会使查询变得非常慢?

    有一天我回答了一个question https stackoverflow com questions 5642880 slow mysql query 5642908 5642908就这样 被认为是正确的 但答案给我留下了很大的疑问 不久