mysql - HAVING 子句和性能

标签 mysql sql performance

我的 SQL (MySql) 查询出现性能问题。基本上我有一个与此类似的表:

ID   PRICE    ID  OBJECT
-----------------------------
1    500.00   1   1
2    300.00   1   1
3    400.00   1   1
4    100.00   1   1
5    100.00   1   1
6    100.00   2   3

我需要获得给定数量的最大行数。

例如,给定金额 1000.00,查询必须返回这些 ID(按价格升序排列)和总价。

ID  PRICE TOTAL_PRICE
---------------------------------
4   100   100.00
5   100   200.00
2   300   500.00
3   400   900.00

Atm 我正在使用类似于以下查询的查询:

set @total=0; 
select a.id, a.price , @total:=@total + a.price as total_price , a.id_user 
from shares a 
where a.`id_user` != 0 and a.id_object = 1 
having @total < 1000.00  order by a.price asc;

它工作正常,但效率不高。提取数据大约需要 1.5 秒(表大约有 1M 行)。

该问题与having 子句有关。

你有什么建议吗?

有没有办法使用子句Having执行此类查询

最佳答案

我相信这个(累积总和)就是您正在寻找的:

set @total = 0;

SELECT ID,
       Price,
       Total_Price
FROM (
    SELECT a.*
        ,(@total := @total + price) AS total_price
    FROM shares a
    WHERE a.id_user != 0
        AND a.id_object = 1
    ORDER BY a.price
    ) q1
WHERE q1.total_price < 1000;

SQL Fiddle Demo

关于mysql - HAVING 子句和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569249/

相关文章:

mysql - 应用程序无法在 ubuntu 上启动,但在 windows 上启动没有任何问题

sql - 根据MySql 5中表 'A'的内容将0..n条记录插入表 'B'

mysql - 计算逗号分隔值并获取另一个值的总和

mysql - 加入多个计数的mysql查询

sql - RAISERROR() 的语法含义是什么

SQL 按列表排序

sql - 为什么LINQ发送sp_executesql而不是直接执行SQL?

c++ - 在 [0..n-1] 范围内生成 m 个不同的随机数

performance - Common Lisp 中前导小数位为 12 的 2 的第一个幂

SQL 效率 - [=] vs [in] vs [like] vs [matches]