Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL的订购速度非常慢。如何优化?_Mysql_Sql_Performance_Optimization_Bigdata - Fatal编程技术网

MySQL的订购速度非常慢。如何优化?

MySQL的订购速度非常慢。如何优化?,mysql,sql,performance,optimization,bigdata,Mysql,Sql,Performance,Optimization,Bigdata,我正在寻找一个解决我的问题,非常缓慢的查询,我希望你能帮助我 首先,我想做的是: 我有一张桌子,让我们把它命名为item_table,里面有一些关于商品的信息。每个项目都有一个orderid。这里的问题是:此订单id不是唯一的 一个项目的每一个变化都可以说是“逐步”记录的。以下是一个例子: order\u id max\u vol剩余\u vol 购买2007468329 8753 4126 购买2007468329 8753 4122 购买3 2007468329 8753 4006 解释一

我正在寻找一个解决我的问题,非常缓慢的查询,我希望你能帮助我

首先,我想做的是:
我有一张桌子,让我们把它命名为item_table,里面有一些关于商品的信息。每个项目都有一个orderid。这里的问题是:此订单id不是唯一的 一个项目的每一个变化都可以说是“逐步”记录的。以下是一个例子:

order\u id max\u vol剩余\u vol
购买2007468329 8753 4126
购买2007468329 8753 4122
购买3 2007468329 8753 4006
解释一下:
每次一个人购买一件商品时,都会有一个具有相同订单id的新条目和一个已更改的剩余卷(剩余卷)。max_vol是卖方在开始时输入的库存总量。一个项目可以有多个订单id,但每次卖家插入某个项目(即使是同一个项目)时,它都会得到一个新的订单id

我现在想做的是:
我想买卖得最多的商品。这意味着我只想得到
MAX(reserve\u vol)
MIN(reserve\u vol)
之间的差异,我只想得到任何东西售出时的物品
(=MAX\u vol!=reserve\u vol)

更具体一点:
以下是“为我的数据表创建表”:

创建表“数据”(
`orderid`bigint(20)默认为空,
`regionid`int(11)默认为空,
`systemid`int(11)默认为空,
`stationid`int(11)默认为空,
`typeid`int(11)默认为空,
`bid`int(11)默认为空,
`价格浮动默认为空,
`minvolume`int(11)默认为空,
`volremaine`int(11)默认为空,
`Winoleter`int(11)默认为空,
`已发布`日期时间默认值为空,
`duration`varchar(32)默认为空,
`范围`int(11)默认为空,
`reportedby`int(11)默认为空,
`reportedtime`datetime默认值为空,
使用BTREE键'orderid'('orderid'),
使用BTREE键'volleisure'('volleisure'),
使用BTREE键'wroleter'('wroleter')
)引擎=InnoDB默认字符集=utf8
我提到的列max_row在表中,level_vol是volleveline

此表包含约6000万个条目

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

向您致以亲切的问候,并希望得到解决

-Lyrex

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

首先,订单应该有一个唯一的订单ID,除非有很好的理由不这样做。相反,您应该做的是使订单ID唯一,并为其提供字段
init\u vol
max\u vol
、和
salled
。当用户购买商品时,您会增加字段
salled
。当您想要获得最畅销的产品时,您可以按<代码>已售出降序订购


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

根据所问的问题和一些假设,希望这个答案能帮助您

我会在你的数据表上创建一个覆盖索引

( typeid, orderid, remain_vol )
由于不知道列的基础,我假设(是的,我知道假设),TYPEID是买卖的某种指示器。如果您只查找“销售”,那么这有助于查询。通过使用orderid,将有助于分组,而remain_vol列可以防止返回原始数据页以应用查询

我也会在你的“item_表”上有一个覆盖索引

(orderid, item)
SELECT
      t.item,
      SUM( PreAgg.MaxVol ) as TotalVolPerItem,
      SUM( PreAgg.MinVol ) as TotalRemainingToSell
   from
      item_table t
      JOIN (SELECT
                  d.orderid,
                  MAX( d.remain_vol ) as MaxVol,
                  MIN( d.remain_vol ) as MinVol
               from
                  data d
               where
                  d.typeid = 'sell'  (or whatever flag indicator if this is correct assumption)
               group by
                  d.orderid
               having
                  MIN( d.remain_vol ) > 0 ) PreAgg
         ON t.orderid = PreAgg.orderID
   group by
      t.item
因此,它可以有效地连接到结果销售订单和项目(如股票名称) 也可以用于快速参考,而无需转到原始数据页

也就是说,我会尝试类似的方法

(orderid, item)
SELECT
      t.item,
      SUM( PreAgg.MaxVol ) as TotalVolPerItem,
      SUM( PreAgg.MinVol ) as TotalRemainingToSell
   from
      item_table t
      JOIN (SELECT
                  d.orderid,
                  MAX( d.remain_vol ) as MaxVol,
                  MIN( d.remain_vol ) as MinVol
               from
                  data d
               where
                  d.typeid = 'sell'  (or whatever flag indicator if this is correct assumption)
               group by
                  d.orderid
               having
                  MIN( d.remain_vol ) > 0 ) PreAgg
         ON t.orderid = PreAgg.orderID
   group by
      t.item

“HAVING”子句基于剩余的最小值。例如,如果订单是500件左右,然后逐渐卖出400、300、200、150、76件,剩下的76件将是你正在考虑的。

你想优化什么SQL?你设置了索引吗?@AlmaDo我正在使用MySQL 5.6.16。@WillP。正如您所看到的,我已经在orderid、volremaine和wholeter上设置了键。我没有primary key.ic,而且我认为Alma的意思是你想优化什么查询我这里的问题是我从一个API获取整个数据,我只想处理它们。我也不喜欢这种结构,但我对如何获取这些数据没有任何影响。我可以在获取这些数据后对其进行预处理,但无论如何,这是一次我必须按原样处理它们。因为我已经发布了我无法影响我获得的数据。我从一个API获取它作为CSV。我还应该提到的是:6000万份参赛作品不是多年收集的。他们在不到一周的时间里就聚集在一起了。这是我的主要问题。