MySQL ORDER BY 非常慢。如何优化?

标签 mysql sql performance optimization bigdata

我正在寻找查询速度极慢的问题的解决方案,希望您能帮助我。

首先,我想做的是:
我有一个表,将其命名为 item_table,其中包含一些有关商品的信息。每个商品都有一个orderid。这里的问题是:此订单 ID 不唯一
项目的每一次变化都可以说是“逐步”记录的。这是一个例子:

             order_id     max_vol   remain_vol
Purchase 1   2007468329   8753      4126
Purchase 2   2007468329   8753      4122
Purchase 3   2007468329   8753      4006

稍微解释一下:
每次有人购买商品时,都会有一个具有相同订单 ID 和更改的剩余量 (remain_vol) 的新条目。 max_vol 是卖家开始时输入的库存总量。一个商品可以有多个订单 ID,但每次卖家插入商品(即使是同一商品)时,它都会获得一个新的订单 ID。

我现在想做的是:
我想要获得销量最高的商品。这意味着我只想获取 MAX(remain_vol)MIN(remain_vol) 之间的差异,并且我只想获取已售出的商品 (=max_vol) !=remain_vol)

更具体一点:
这是我的数据表的创建表:

CREATE TABLE `data` (    
    `orderid` bigint(20) DEFAULT NULL,    
    `regionid` int(11) DEFAULT NULL,    
    `systemid` int(11) DEFAULT NULL,
    `stationid` int(11) DEFAULT NULL,
    `typeid` int(11) DEFAULT NULL,
    `bid` int(11) DEFAULT NULL,
    `price` float DEFAULT NULL,
    `minvolume` int(11) DEFAULT NULL,
    `volremain` int(11) DEFAULT NULL,
    `volenter` int(11) DEFAULT NULL,
    `issued` datetime DEFAULT NULL,
    `duration` varchar(32) DEFAULT NULL,
    `range` int(11) DEFAULT NULL,
    `reportedby` int(11) DEFAULT NULL,
    `reportedtime` datetime DEFAULT NULL,
      KEY `orderid` (`orderid`) USING BTREE,
      KEY `volremain` (`volremain`) USING BTREE,
      KEY `volenter` (`volenter`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我提到的列max_row在表volenter中,remain_volvolremain

该表包含大约 6000 万个条目

有人知道如何解决这个问题吗?
我已经尝试过一些查询,但它们都需要很长时间才能执行。

亲切的问候并希望得到解决
- 天琴座

最佳答案

我认为问题在于你的表格的结构方式。当用户购买商品时,您不应向表中添加新条目。这种方法有很多问题。

首先,订单应该有一个唯一的订单 ID,除非有充分的理由不这样做。您应该做的是使订单 ID 唯一,并为其指定字段 init_volmax_volsold。当用户购买商品时,您会增加字段 sold。当您想要获得最畅销的商品时,您可以按已售出降序排列。

这样您就不会不必要地增加表。您的所有查询都变得更加简单和快捷。

关于MySQL ORDER BY 非常慢。如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888718/

相关文章:

javascript - 在 Javascript 中迭代对象属性的最快方法是什么?

php - 通过点击优化内容流行度查询

mysql - 使用 MyDAC 执行 proc

sql - 每周汇总最近加入的记录

php - 使用 PHP 确保添加到 MySQL 表的唯一性

mysql - 使用 JOIN 查询速度慢

java - 自动完成服务器端实现

mysql - 大删除查询超时

php - Openfire:存档消息 NULL 参与者

sql - 是否有一种[直接的] 方式来使用 SQL 对结果进行排序 *首先*,*然后* 按另一列分组?