Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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
Php 使用ORDER BY和Have时加快MySQL查询速度_Php_Mysql - Fatal编程技术网

Php 使用ORDER BY和Have时加快MySQL查询速度

Php 使用ORDER BY和Have时加快MySQL查询速度,php,mysql,Php,Mysql,我有一个数据库,里面有一大堆游戏的市场订单。我和DB的目的是低买高卖,所以我所做的是搜索任何我可以赚钱的产品。我输入一个起点和一个终点,然后检查DB中是否有在起点销售的产品,并检查终点中是否有任何匹配且有利润的采购订单 现在我有大约750k个列表,处理查询大约需要8秒钟。当我排得更少时,花的时间就更少了。一旦数据库满了,我可能会有超过500万个条目,我需要考虑如何加快查询速度。我知道,当我取出HAVING和ORDER BY时,查询大约需要.25/s。在mySQL中是否有其他方法可以做到这一点,或

我有一个数据库,里面有一大堆游戏的市场订单。我和DB的目的是低买高卖,所以我所做的是搜索任何我可以赚钱的产品。我输入一个起点和一个终点,然后检查DB中是否有在起点销售的产品,并检查终点中是否有任何匹配且有利润的采购订单

现在我有大约750k个列表,处理查询大约需要8秒钟。当我排得更少时,花的时间就更少了。一旦数据库满了,我可能会有超过500万个条目,我需要考虑如何加快查询速度。我知道,当我取出HAVING和ORDER BY时,查询大约需要.25/s。在mySQL中是否有其他方法可以做到这一点,或者我是否应该找到一种在PHP中实现这一点的方法?任何帮助都将不胜感激

我的问题是:

    SELECT DISTINCT  
    f.orderID as fOrderID,
    f.typeID as fTypeId,
    f.solarSystemID as fSystemId,
    f.regionID as fRegionId,
    f.price as fPrice,
    f.volRemaining as fVolRemain,
    f.bid as fBid,
    f.reportedTime as fReportedTime,
    t.orderID as tOrderID,
    t.typeID as tTypeId, 
    t.solarSystemID as tSystemId,
    t.regionID as tRegionId,
    t.price as tPrice,
    t.volRemaining as tVolRemain,
    t.bid as tBid,
    if(((f.volRemaining < t.volRemaining)),
      ((f.volRemaining * t.price) - (f.price * f.volRemaining)), 
      ((t.volRemaining * t.Price) - (f.price * t.volRemaining))) as profit,
    t.reportedTime as tReporedtTime
    FROM marketData as f
    JOIN marketData as t on t.typeID = f.typeID 
    WHERE f.regionID = 10000001
    AND t.regionID = 10000030
    AND f.bid = 0
    AND t.bid = 1
    GROUP BY f.orderID
    HAVING profit > 1000000
    ORDER BY profit DESC
    LIMIT 100       
编辑: 补充说明:

id  select_type  table   type    possible_keys    key    key_len  ref              rows    Extra
1   SIMPLE       f       ALL     typeID           NULL   NULL     NULL             761338  Using where; Using temporary; Using filesort
1   SIMPLE       t       ref     typeID           typeID 8        market.f.typeID  76      Using where

看起来这个表应该有2个索引。一个索引包括(regionID、bid、typeID),可能是按顺序排列的,另一个索引只有(typeID)。第一个索引将用于快速扫描f以查找符合条件的记录,并检索typeID(它位于索引中)。第二个索引将在t上用于连接。我不知道为什么它不同时使用更大的索引来包含where子句,但它可能会随着MySQL的更高版本而改变

根据您的实际数据模式,您可以通过同时创建第一个索引的多个变体来稍微调整第一个索引,只需尝试6种不同的可能顺序,并运行解释计划以查看使用了哪个索引。然后简单地删除未使用的索引

注1: 拥有这两个索引将降低表上的插入和删除速度,但我认为这个连接查询的速度将是一个更大的问题,特别是没有索引的情况下

注2:
减少表中的列数也会有所帮助,但是没有解决连接的缩放问题。

在选择之前添加一个
解释
,看起来是这样的:
解释选择…
并发布结果。RegionID应该有一个索引。Ryan:我在我的帖子中添加了解释。Adder:我以前确实对RegionID进行了索引。我可以再添加一次,看看效果如何。加法器:我将索引添加到regionID,查询需要相同的时间。哇,这将查询速度降低到了.33/秒。我还有一些来自其他表的带有附加连接的查询,所以我将尝试使用索引,看看是否可以进一步删除它,但它们比以前要好得多。不知道您可以对索引进行分组。有没有关于加快插入速度的建议,或者我只需要处理速度较慢的问题?我计划将数据24/7地输入我的数据库。除了索引更少或索引列更少之外,没有办法避免索引带来的开销。我不太了解如何加快插入速度,但您可以查看MySQL文档()。请确保切换到MySQL的正确版本。如果数据不需要持久化(在重新启动之间存储),那么还可以查看内存数据库引擎。
id  select_type  table   type    possible_keys    key    key_len  ref              rows    Extra
1   SIMPLE       f       ALL     typeID           NULL   NULL     NULL             761338  Using where; Using temporary; Using filesort
1   SIMPLE       t       ref     typeID           typeID 8        market.f.typeID  76      Using where