使用索引、使用临时、使用文件排序 - 如何解决这个问题?

2023-12-22

我正在开发一个事件跟踪系统,该系统使用一些查找表以及主日志记录表。在我正在编写的报告中,可以选择一个对象来查看统计信息。该界面按重要性递减的顺序显示所有对象(即点击数)。

两个表的架构(稍微精简,但您明白了要点):

CREATE TABLE IF NOT EXISTS `event_log` (
  `event_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(5) DEFAULT NULL,
  `object_id` int(5) DEFAULT NULL,
  `event_date` datetime DEFAULT NULL,
  PRIMARY KEY (`event_id`),
  KEY `user_id` (`user_id`),
  KEY `object_id` (`object_id`)
);

CREATE TABLE IF NOT EXISTS `lookup_event_objects` (
  `object_id` int(11) NOT NULL AUTO_INCREMENT,
  `object_desc` varchar(255) NOT NULL,
  PRIMARY KEY (`object_id`)
);

我遇到问题的查询如下。它适用于我的大约 100 个条目的表,但 EXPLAIN 有点让我担心。

    explain SELECT 
            el.object_id, 
            leo.object_desc, 
            COUNT(el.object_id) as count_rows
        FROM 
            event_log el 
            LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id
        GROUP BY 
            el.object_id
        ORDER BY 
            count_rows DESC,
            leo.object_desc ASC

返回:Using index; Using temporary; Using filesort

那么——我的架构和/或 MySQL 查询有什么问题吗?temporary and filesort?或者它是否可以使用 ORDER BY 进行优化?


Well, the doc http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html给出出现“使用临时”的确切原因:

临时表可以在以下条件下创建:

如果存在 ORDER BY 子句和不同的 GROUP BY 子句,或者如果 ORDER BY 或 GROUP BY 包含除 连接队列中的第一个表会创建一个临时表。

DISTINCT 与 ORDER BY 结合可能需要临时表。

如果使用 SQL_SMALL_RESULT 选项,MySQL 将使用内存中 临时表,除非查询还包含元素(描述 稍后)需要磁盘存储。

快速扫描显示您患有#1。

And 这个博客 https://www.percona.com/blog/2009/03/05/what-does-using-filesort-mean-in-mysql/from 2009 说“使用文件排序”意味着不能使用索引执行排序。由于您是按计算字段排序,因此这也是正确的。

所以,这就是“错误”的地方。

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

使用索引、使用临时、使用文件排序 - 如何解决这个问题? 的相关文章

  • 如何在查询中获取 MySQL 状态

    是否可以在 MySQL 查询中使用服务器状态变量 我可以从 显示状态 中看到各种指标 但如何计算派生值 例如查询缓存命中率 show global status like Qcache inserts show global status
  • Laravel updateOrCreate 带有自动增量数据库

    我的目的是如果值存在则更新 否则插入新行提交表单后在数据库表中 问题是 这里的函数添加新列在数据库表中而不是更新它们 这是我的功能 MyModel updateOrCreate array myField gt myValue gt whe
  • 为什么Mysql在连接另一个表B时对表A使用全表扫描?

    我有一个表 A 和一个表 B 我正在从表 A 中选择信息 其中我只需要表 A 中的信息 其中表 B 联接表 A 我在联合列和 WHERE 子句上有索引 这是选择代码 SELECT FROM tableA INNER JOIN tableB
  • 如何用 numpy 在 Cython 中表示 inf 或 -inf ?

    我正在用 cython 逐个元素构建一个数组 我想存储常量np inf or 1 np inf 在某些条目中 然而 这将需要返回 Python 进行查找的开销inf 有没有libc math相当于这个常数 或者其他一些可以轻松使用的值 相当
  • postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换)

    刚接触 postgresql 这可能很简单 但我不明白 我在 mysql 中有这个 insert into APP USERS VALUES 1 admin adminemailid System Administrator SysAdmi
  • Codeigniter 活动记录选择、左连接、计数

    我有一个显示数据库查询结果的表单 这些结果可以有许多其他资产与之相连 我想找到一种方法来显示每个元素有多少资产 例如 我的表是英格兰地区 另一个表是用户居住的地方 我当前有这个代码 this gt db gt select this gt
  • MVC 4 中的运行时动态捆绑和缩小

    我想知道是否有人可以帮助我使用 MVC 4 附带的新优化命名空间进行捆绑和缩小 我有一个多租户应用程序 我想在其中决定应根据每个用户的设置加载哪些 js 文件 一种方法是预先创建所有包并根据用户的设置更改resolvebundleurl的虚
  • 我们如何在存储过程中使用 mysql_affected_rows()

    我们如何使用mysql affected rows 在存储过程中 Use the ROW COUNT http dev mysql com doc refman 5 1 en information functions html funct
  • MySQL 存储映像 BLOB 不良实践性能

    我知道不建议在 SQL 中将图像存储为 BLOB 然而 在我的本地 PC 和服务器上同时工作使得在两者之间同步图像变得困难 是否还有理由不单独使用 BLOB 作为备份 这会在本地创建缓存文件 以静态方式提供服务 本质上 只有选择 BLOB
  • mysql连接3个表

    如何连接三个具有一个公共列 id 的mysql表 例如 从表1中选择a b 从表2中选择c d 从表3中选择e f 其中id x 谢谢 SELECT t1 a t1 b t2 c t2 d t3 e t3 f FROM table1 t1
  • 初学者 MYSQL 错误 - 访问被拒绝

    错误 1045 28000 用户 root localhost 的访问被拒绝 使用密码 N 哦 我已经尝试了一切 我已经阅读了一页又一页的答案 但似乎没有人知道正确的答案 当我尝试登录我的数据库时 我只是收到上述错误 我还没有设置密码或其他
  • 简化 Django 中的表单提交

    我在 Django 中有一个表单 用户可以在其中以单个表单提交文件 图像 文本 如下所示
  • 在函数中使用node-mysql

    我对 Nodejs 很陌生 有一个问题 尝试创建一个函数 该函数将调用我在表中提到其 ID 的任何字段的值 function getUserInfo userID dynamicField var query connection quer
  • ? LIKE(列 || '%')

    我可以有这样的条件吗 SELECT FROM table WHERE LIKE column 哪里的 是一个字符串参数值 例如 这些参数值 当列等于时应返回 true admin products admin products 1 admi
  • 无法从外部 bash 脚本正确设置 MySQL 密码

    我有两个脚本 主要的一个脚本执行一些不同的操作并调用第二个脚本 第二个脚本安装 MySQL 从我的主脚本中我做了这样的事情 read p Set the password for the database min 4 characters
  • 为什么 JPA/hibernate 不能映射到 MySQL blob 类型?

    我收到以下错误 Caused by org hibernate HibernateException Wrong column type in TestTable for column PAYLOAD Found blob expected
  • 如何避免MySQL'尝试获取锁时发现死锁;尝试重新启动交易'

    我有一个innoDB表 记录在线用户 它会在用户每次刷新页面时进行更新 以跟踪他们所在的页面以及他们上次访问该网站的日期 然后我有一个每 15 分钟运行一次的 cron 来删除旧记录 我收到 尝试获取锁定时发现死锁 昨晚尝试重新启动事务大约
  • 如何使用Python优化大型数据集的API调用?

    客观的 将地址列表发送到 API 并提取某些信息 例如 指示地址是否位于洪水区域的标志 Solution 适用于小数据的 Python 脚本 Problem 我想针对大输入优化当前的解决方案 如何提高 API 调用的性能 如果我有 100
  • cron 作业或 PHP 调度程序

    我使用 MYSQL 作为我的数据库 PHP 作为我的编程语言 我想运行一个 cron 作业 该作业将运行直到当前系统日期与我的数据库表中名为 PROJECT 的 截止日期 日期 列匹配 一旦日期相同的是 必须运行更新查询 这会将状态 项目表
  • MYSQL枚举:@rownum,奇偶记录

    我问了一个关于为查询结果创建临时 虚拟 ID 的问题 mysql 和 php 查询结果的临时 虚拟 ID https stackoverflow com questions 4063998 mysql php temporary virtu

随机推荐

  • sbt 编译时警告:类型模式 List[String] 中的非变量类型参数 String

    我的 sbt 显示警告消息 non variable type argument String in type pattern List String the underlying of List String is unchecked s
  • Eclipse 意外退出 2022-06 [重复]

    这个问题在这里已经有答案了 我开始学习Java 几天来一直遇到这个错误 我安装了 eclipse 并且运行得很好 第二天 当我尝试打开该应用程序时 它打不开 并且收到一条消息 无法打开应用程序 Eclipse 进而 Eclipse 意外退出
  • Python 和 urllib2:如何使用参数发出 GET 请求

    我正在构建一个 API API 它基本上是内部 REST Web 服务的包装器 Web 应用程序将向该服务发出大量请求 一些Web服务调用需要是GET而不是POST 而是传递参数 是否有一种 最佳实践 方法将字典编码为查询字符串 例如 fo
  • 有选择地从 MySQL 中删除大部分重复的记录

    我有一张桌子 PRICE UPDATE id int 5 auto increment primary unique part number varchar 10 non null price float 10 2 non null 一些p
  • 如何从 SQL Server 导出到 XML

    从 SQL Server 表或视图 导出到 XML 的最简单方法是什么 这就是我到目前为止所做的 执行Sql任务 SELECT FROM Production Product FOR XML AUTO TYPE ROOT Data 结果集
  • F# 编译错误

    我有以下导致编译错误的 F 代码 persistence fs 32 21 错误 FS0072 根据此程序点之前的信息查找不确定类型的对象 在此程序点之前可能需要类型注释来约束对象的类型 这可以使查找得以解决 错误出现在 serialize
  • 正则表达式如何匹配除空行之外的所有行尾?

    如果我有文字 AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE FFFFFF GGGGGG HHHHHH 我想匹配除空行之外的所有行尾并将行尾替换为制表符 s 部分有效 但它也匹配非空行的最后一个字符 不起作用 什么是正
  • GNU 语句表达式的编译器支持

    哪些现代编译器支持 Gnu 语句表达式 C 和 C 语言 我应该在什么版本中使用语句表达式 语句表达式就像 code code retval int b 56 int c int a a sin b a 我已经知道一些这样的编译器 海湾合作
  • 如何编写一个以 C++ 代码作为输入的 C++ 代码生成器?

    我们有一个 CORBA 实现 可以为我们自动生成 Java 和 C 存根 由于 CORBA 生成的代码很难使用 因此我们需要围绕 CORBA 代码编写包装器 帮助器 所以我们有一个两步代码生成过程 是的 我知道这很糟糕 CORBA IDL
  • PHP/MySQL 更好的用户搜索

    为了让代码焕发新的活力 我大部分时间都是在 14 多年前编写的 我发现我当时写的可爱的小设置 在某些地方缺乏 即处理用户输入 Lesson 永远不要低估用户通过验证器注入垃圾 拼写错误和欺骗的能力 旧方法已达到临界质量 因为 SELECT
  • 在 Ubuntu 16.04 Xenial 上安装 PostGIS

    我想在 Ubuntu xenial 16 04 上安装带有 PostgreSQL 9 6 的 PostGIS 2 3 sudo sh c echo deb http apt postgresql org pub repos apt trus
  • php.ini 和 .htaccess 有什么区别?

    假设我想改变的值 php value post max size 20M in htaccess post max size 20M in php ini 两者都会执行相同的操作 那么有什么区别php ini and htaccess 中的
  • 如何从意图服务向活动发送消息[重复]

    这个问题在这里已经有答案了 基本上 我有一个带有进度对话框的活动 我正在向意图发送一条消息 以从互联网加载所有数据 而应用程序中不会出现任何问题 但是 我能够向服务发送消息 但无法将消息重新发送到活动 该怎么办 以下是我向服务发送消息的方式
  • stl::list 对象的最大数量

    问题是在数据集中找到周期性图形模式 所以我有 1000 个时间步长 每个时间步长都有一个图表 编码为整数 因此 该图可能出现 999 个可能的周期 我还定义了一个相位偏移 定义为 时间步模周期 对于在周期为 2 的第 5 个时间步长中首次出
  • 在没有 cookie 的情况下保留浏览器客户端 javascript/HTML 数据

    我创建了一个使用 Python HTML 和 javascript 的网站 主主页有 19 个可编辑变量字段 如果我更改任何这些字段值 然后离开页面 单击我的其他链接选项卡之一 然后返回我的主页 我的所有变量都会重置回默认值 因为页面会重新
  • 如何在 python 中获得按创建日期排序的目录列表?

    获取目录中所有文件的列表 按日期排序 的最佳方法是什么 创建 修改 在 Windows 机器上使用 python 我过去曾使用 Python 脚本执行此操作来确定目录中最后更新的文件 import glob import os search
  • 为什么我不能将 Number 转换为 Double?

    weight是一个字段 数字在火库 https firebase google com docs firestore manage data data types 设置100 int weight json weight double we
  • 我什么时候应该在片段中获得宽度视图

    我在 Linearlayout 中以编程方式添加视图 按钮 LinearLayout 通过 Fragment 中的 XML 进行布局 我想获取按钮宽度 但总是返回0 我用谷歌搜索了这个问题 getWidth 仅适用于WindowFocusC
  • 仅在执行路径上应用传递

    我有一个过程正在分析整个模块 使用runOnFunction 但我想将它应用到每个执行路径上 执行路径是指从程序中的某个点 用 start 注释 开始到程序的终止点 用 end 注释 的指令序列 我假设我必须通过构造 CallGraph 将
  • 使用索引、使用临时、使用文件排序 - 如何解决这个问题?

    我正在开发一个事件跟踪系统 该系统使用一些查找表以及主日志记录表 在我正在编写的报告中 可以选择一个对象来查看统计信息 该界面按重要性递减的顺序显示所有对象 即点击数 两个表的架构 稍微精简 但您明白了要点 CREATE TABLE IF