草庐IT

mysql - 请求执行时间过长

coder 2023-10-25 原文

我正在寻找一些建议或优化。 表定义:

CREATE TABLE IF NOT EXISTS MilestonesAndFlags(
    id SERIAL,
    site_id BIGINT,
    milestone BIGINT,
    value BIGINT,
    TIMESTAMP BIGINT,
    timestamp_confirmation BIGINT,
    COMMENT TEXT,
    INDEX(site_id),
    INDEX(milestone),
    INDEX(milestone,site_id)
);

在此表中,我为每个不同的站点存储了带有时间戳的不同里程碑(以便能够对任何更改进行历史查看)。表当时大约有百万行。

当我尝试使用类似查询获取每个站点的最新实际里程碑值时出现问题

SELECT site_id,
       value
FROM SitesMilestonesAndFlags
WHERE id IN
        (SELECT max(id)
         FROM SitesMilestonesAndFlags
         WHERE milestone=1
         GROUP BY milestone,
                  site_id);

此请求执行时间在我的 PC 上多了 5 分钟.. EXPLAIN 似乎没问题:

+----+--------------------+--------------------+------+-----------------------+-------------+---------+-------+--------+--------------------------+
| id | select_type        | table              | type | possible_keys         | key         | key_len | ref   | rows   | Extra                    |
+----+--------------------+--------------------+------+-----------------------+-------------+---------+-------+--------+--------------------------+
|  1 | PRIMARY            | MilestonesAndFlags | ALL  | NULL                  | NULL        | NULL    | NULL  | 1111320| Using where              |
|  2 | DEPENDENT SUBQUERY | MilestonesAndFlags | ref  | milestone,milestone_2 | milestone_2 | 9       | const |  180660| Using where; Using index |
+----+--------------------+--------------------+------+-----------------------+-------------+---------+-------+--------+--------------------------+

关于更正确的查询或表结构的任何建议? MySQL >= 5.5

最佳答案

我会尝试并建议您使用临时别名表,而不是作为依赖子查询 的where 语句。不确定 mysql 是否针对主/外部查询的每一行优化或运行子查询。

如果您对大数据量运行查询并返回结果,那将非常有趣。

示例:

SELECT *
FROM MilestonesAndFlags AS MF,

  (SELECT max(id) AS id
   FROM MilestonesAndFlags
   WHERE milestone=1
   GROUP BY milestone,
            site_id) AS MaxMF
WHERE MaxMF.id = MF.id;

SQLFiddle:http://sqlfiddle.com/#!2/a0d628/10

优缺点:

专业人士: 避免依赖子查询。

缺点:

  • 加入导致转换和选择。这会导致临时表的所有行都与原始表的行“相乘”,然后是条件过滤器。

更新

我还怀疑 mysql 的版本在完成的优化中起着重要作用。 下面是 2 个不同 mysql 版本的解释结果,其中一个将子查询定义为依赖,另一个将子查询定义为非依赖。

MySQL 5.5.32

ID  SELECT_TYPE     TABLE   TYPE    POSSIBLE_KEYS   KEY     KEY_LEN     REF     ROWS    EXTRA
1   PRIMARY     MilestonesAndFlags  ALL     (null)  (null)  (null)  (null)  29  Using where; Using filesort
2   DEPENDENT SUBQUERY  MilestonesAndFlags  ref     milestone,milestone_2   milestone_2     9   const   15  Using where; Using index

http://sqlfiddle.com/#!2/a0d628/11

MySQL MySQL 5.6.6 m9

ID  SELECT_TYPE     TABLE   TYPE    POSSIBLE_KEYS   KEY     KEY_LEN     REF     ROWS    EXTRA
1   PRIMARY     MilestonesAndFlags  ALL     (null)  (null)  (null)  (null)  29  Using where; Using filesort
2   SUBQUERY    MilestonesAndFlags  ref     milestone,milestone_2   milestone_2     9   const   15  Using where; Using index

http://sqlfiddle.com/#!9/a0d62/2

关于mysql - 请求执行时间过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24527817/

有关mysql - 请求执行时间过长的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  4. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  5. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

  6. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  9. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  10. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

随机推荐