首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >需要优化MySQL选择查询的帮助

需要优化MySQL选择查询的帮助
EN

Stack Overflow用户
提问于 2011-01-20 15:24:17
回答 2查看 137关注 0票数 1

我有一张像这样的MySQL桌子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
day     int(11) 
hour    int(11)    
amount  int(11)   

日是一个整数,其值从0到365,假设小时是时间戳,而数量只是一个简单的整数。我想要做的是为某一组天数(例如,从0到10)选择value字段的值,但我只需要当天可用金额的最后一个值,它实际上是hour字段的最大值(在当天内)。这听起来并不难,但我想出的解决方案是完全没有效率的。

下面是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT q.day, q.amount 
    FROM amt_table q 
    WHERE q.day >= 0 AND q.day <= 4 AND q.hour = (
        SELECT MAX(p.hour) FROM amt_table p WHERE p.day = q.day
    ) GROUP BY day

在11k行表上执行该查询需要5秒,而且只需5天;我可能需要选择整个月或一年的时间跨度,因此这不是一个有效的解决方案。

任何能帮我找到另一种解决方案或优化这个解决方案的人都是非常感谢的。

编辑

没有设置索引,但是(日、小时、量)可能是主键(如果需要的话)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-20 15:30:20

使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT a.day, 
       a.amount
  FROM AMT_TABLE a
  JOIN (SELECT t.day,
               MAX(t.hour) AS max_hour
          FROM AMT_TABLE t
      GROUP BY t.day) b ON b.day = a.day
                       AND b.max_hour = a.hour
 WHERE a.day BETWEEN 0 AND 4

我认为您使用GROUP BY a.day只是为了每天获得一个金额值,但这并不可靠,因为在MySQL中,组中的列不是任意的--值可能会改变。遗憾的是,MySQL还不支持分析(ROW_NUMBER等),这是您通常用于这种情况的方法。

首先查看主键上的索引,然后在用于将表连接在一起的列上添加索引。复合索引(从多个列到一个索引)也是一个选项。

票数 4
EN

Stack Overflow用户

发布于 2011-01-20 15:31:26

我认为问题在于where子句中的子查询。MySQl将首先计算整个表的“从amt_table p中选择最大(p.hour),p.day = q.day”,然后选择天数。效率不高:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4753833

复制
相关文章
pl sql 循环_sql循环语句怎么写
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/07
3.1K0
pl sql 循环_sql循环语句怎么写
PL-SQL温习
1.SELECT PRODUCT_NAME, PRODUCT_PRICE*0.8 FROM PRODUCT
liulun
2022/05/09
5450
sql语句日期格式_sql日期类型怎么写
SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm 例如: select getdate() 2004-09-12 11:06:08.177 整理了一下SQL Server里面可能经常会用到的日期格式转换方法: 举例如下: select CONVERT(varchar, getdate(), 120 ) 2004-09-12 11:06:08
全栈程序员站长
2022/11/01
2.5K0
OushuDB-PL 过程语言-基本语句
\1. 赋值: PL/pgSQL中赋值语句的形式为:identIFier := expression,等号两端的变量和表达式的类型或者一致, 或者可以通过PostgreSQL的转换规则进行转换,否则将会导致运行时错误,见如下示例: \2. SELECT INTO: 通过该语句可以为记录变量或行类型变量进行赋值,其表现形式为:SELECT INTO target select_expressions FROM ...,该赋值方式一次只能赋值一个变量。表达式中的target可以表示为是一个 记录变量、行变量,或者是一组用逗号分隔的简单变量和记录/行字段的列表。select_expressions以及 剩余部分和普通SQL一样。 如果将一行或者一个变量列表用做目标,那么选出的数值必需精确匹配目标的结构,否则就会产生运行 时错误。如果目标是一个记录变量,那么它自动将自己构造成命令结果列的行类型。如果命令返回零 行,目标被赋予空值。如果命令返回多行,那么将只有第一行被赋予目标,其它行将被忽略。在执行 SELECT INTO语句之后,可以通过检查内置变量FOUND来判断本次赋值是否成功,如: name RECORD; user_id := 20;
用户7454708
2023/05/08
5060
sql语句修改字段类型「建议收藏」
sp_rename ‘表名.原字段名’,’表名.新字段名’ 例如我想把Card_Info表里面的OnDate改为Date: sp_rename ‘Card_Info.OnDate’,’Card_Info.Date’
全栈程序员站长
2022/07/01
2.3K0
PL/SQL --> PL/SQL记录
PL/SQL记录有着类似于表的数据结构,是一个或多个字段且拥有数据类型的集合体。定义了PL/SQL记录类型之后,可以定义PL/SQL记录变
Leshami
2018/08/07
7600
PL/SQL --> 动态SQL的常见错误
动态SQL在使用时,有很多需要注意的地方,如动态SQL语句结尾处不能使用分号(;),而动态PL/SQL结尾处需要使用分号(;),但不能使用正
Leshami
2018/08/07
2.2K0
Python忽略warning警告错误
从网上整理了一下Python忽略warning警告错误 方法一:直接运行脚本的时候加入参数 python -W ignore yourscript.py 方法二:代码中加入参数 import warnings with warnings.catch_warnings(): warnings.filterwarnings("ignore",category=DeprecationWarning) import pymssql #需忽略警告的模块 yourcode()
py3study
2020/01/07
1.4K0
pl sql 查看历史执行过的sql记录
现在越来越多人用plsql 查询和执行sql,因为该工具很方便,不仅可以执行sql、以及命令窗口,但是呢,有时候我们执行完sql,可能忘记保存或者当时觉得可能不怎么重要,就没有保存,
小小鱼儿小小林
2020/06/24
3.6K0
pl sql 查看历史执行过的sql记录
PL/SQL编程基础简介及实践
1、开始(p1~p2) 2、背景介绍(p3) 3、特性优点(p4~p5) 4、使用说明(p6) 5、语法结构(p7) 6、命名参考(p8~p9) 7、复合类型(p10~p16) 8、运算符(p17) 9、流程控制语句(p18~p28) 10、异常和错误处理(p29~32) 11、函数与存储过程(p33~p41) 12、结束(p42)
星哥玩云
2022/08/16
1.5K0
PL/SQL 游标变量
    游标变量与游标相似,有其共性,也有其不同点。就其共性来说两者都是指向多行查询的结果集中的当前行。都要经历声明,打开,检索与关闭的过程。所不同的是游标与游标变量类似于常量与变量。游标是静态的,而游标变量是动态的,因为游标变量并不与某个特定的查询相绑定。所以,游标变量可以打开任何类型兼容的查询。其次可以将游标变量作为参数传递给本地和存储子程序。本文主要描述游标变量的使用。
Leshami
2018/08/14
1.3K0
if sql语句_SQL IF语句介绍和概述
This article explores the useful function SQL IF statement in SQL Server.
全栈程序员站长
2022/09/13
2.4K0
if sql语句_SQL IF语句介绍和概述
sql语句
参考以下 SQL> select * from test; ID MC ---------- ------------- 1 11111 1 22222 2 11111 2 22222 3 11111 3 22222 3 33333 已选择7行。 SQL> select id,ltrim(max(sys_connect_by_path(mc,',')),',') row2col from (select id,mc, id+(row_number() over(ord
阿新
2018/04/09
1.6K0
PL/SQL --> 游标
映射在结果集中某一行数据的具体位置,类似于C语言中的指针。即通过游标方式定位到结果集中某个特定的行,然后根据业务需求
Leshami
2018/08/07
1K0
OushuDB-PL 过程语言-PL/pgSQL - SQL过程语言
OushuDB兼容PostgreSQL,允许使用除了 SQL 和 C 之外的其他语言编写用户定义的函数。这些其他的 语言通常被称作过程语言(Procedural Language, PL)。对于一个用过程语言编写的函数,数据库服务 器没有关于如何解释该函数的源文本的内建知识。因此,这个任务被交给一个了解语言细节的特殊处理 器。该处理器能够自己处理所有的解析、语法分析、执行工作,或者它可以作为一种PostgreSQL和编程 语言既有实现之间的“粘合剂”。就像任何其他 C 函数一样,处理器本身是一个编译到共享对象并且按需 载入的 C 语言函数。 在OushuDB的标准发布中当前有四种过程语言可用: PL/pgSQL、 PL/Perl、 PL/Python以及 PL/Java, 其中PL/pgSQL是默认安装可用的。 另外还有其他过程语言可用,但是它们没有被包括在核心发布中, 如PL/R等,我们可以在第三方开源网站来获取它们的源码。 接下来我们主要看一下 PL/pgSQL - SQL过程语言。 PL/pgSQL - SQL过程语言 PL/pgSQL 是 PostgreSQL 数据库系统的一个可加载的过程语言,它的设计目标是创建一种可加载的过 程语言,可以: 用于创建函数和触发器过程 为 SQL 语言增加控制结构 执行复杂的计算 继承所有用户定义类型、函数、操作符 定义为被服务器信任的语言 容易使用 除了用于用户定义类型的输入/输出转换和计算函数以外,任何可以在 C 语言函数里定义的东西都可以在 PL/pgSQL 里使用。比如,可以创建复杂的条件计算函数,并随后将之用于定义操作符或者用于函数索 引中。 一、概述: PL/pgSQL函数在第一次被调用时,其函数内的源代码(文本)将被解析为二进制指令树,但是函数内的表 达式和SQL命令只有在首次用到它们的时候,PL/pgSQL解释器才会为其创建一个准备好的执行规划,随 后对该表达式或SQL命令的访问都将使用该规划。如果在一个条件语句中,有部分SQL命令或表达式没 有被用到,那么PL/pgSQL解释器在本次调用中将不会为其准备执行规划,这样的好处是可以有效地减少 为PL/pgSQL函数里的语句生成分析和执行规划的总时间,然而缺点是某些表达式或SQL命令中的错误只 有在其被执行到的时候才能发现。 由于PL/pgSQL在函数里为一个命令制定了执行计划,那么在本次会话中该计划将会被反复使用,这样做 往往可以得到更好的性能,但是如果你动态修改了相关的数据库对象,那么就有可能产生问题,如:
用户7454708
2023/05/08
7120
Mysql常用sql语句(21)- regexp 正则表达式查询
https://www.cnblogs.com/poloyy/category/1683347.html
小菠萝测试笔记
2020/06/09
2K0
Mysql常用sql语句(21)- regexp 正则表达式查询
python selenium 打开chrom 忽略ssl错误
chromedriver = "chromedriver.exe" options = webdriver.ChromeOptions() options.add_argument('--ignore-certificate-errors') browser = webdriver.Chrome(chromedriver, chrome_options=options) browser = webdriver.Chrome(chromedriver)
用户5760343
2022/01/09
1K0
SQL Server常用Sql语句
30.使用COMPUTE BY子句可以对BY后面给出的列进行分组分组显示,并进行列的小计
Sindsun
2019/12/06
5.3K0
Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?
JSqlParser是一个用Java编写的SQL解析器,可以将SQL语句解析为Java对象,从而使开发人员能够轻松地分析、修改和重构SQL查询。
程序猿川子
2023/03/10
4.1K0
批量添加的sql语句_批量执行sql语句
mysql允许我们在一条sql语句中批量插入数据(中间逗号分隔),如下sql语句:
全栈程序员站长
2022/11/09
4.7K0

相似问题

Laravel -创建具有belongsTo关系的对象

12

创建具有belongsTo关系的记录时出错- Ember.js

12

模型创建后BelongsTo关系中的意外行为

13

成员和帆创建/保存关系(BelongsTo/HasMany)

20

无法创建包含belongsTo关系的grails条件查询

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文