首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化高索引表的插入/更新查询

优化高索引表的插入/更新查询
EN

Stack Overflow用户
提问于 2014-12-26 10:59:01
回答 3查看 198关注 0票数 1

我正在使用一个基于OpenCart 1.5.6.4的网站,该网站已经从原始网站中被高度修改(添加索引,修改查询,您可以说,这只是为了性能)。

服务器是一个带有2×2 2GHz处理器50 4GB4GB RAM的VPS。目前它有CentOS 6Apache2.2.15MySQL 5.1.73。该网站是一个在线商店,约有50,000产品和9家供应商。

整个系统的最初逻辑是:

  • 以不同的“缓冲”表从供应商进口所有产品。
  • 将所有产品类别从不同的“缓冲器”表中导入(用于映射目的)
  • 更新网站上的产品..。禁用那些不再可用的库存,或者根据以下规则更新现有产品的库存:“如果供应商之间有共同的产品,那么在股票=0的地方采取最低的价格,否则采取最低的价格”。

我在更新过程中遇到了一些麻烦。我尝试过一些不同的脚本(选择多个表上每个两个表之间的所有公共值。),但是只运行一个查询需要大约3秒。

我没有太多的OOP经验,所以我处理数组:我在一个数组中加载所有的产品数据,在另一个数组中加载排除列表,我检查第一个数组中的产品是否没有在第二个数组中设置,对规则做数学运算,用大容量INSERT [...] ON DUPLICATE KEY UPDATE [...]编写数据。

整个更新需要使用ages,大约在20秒和“吃掉”65% CPU (基于phpmyadmin中的读数)。我需要一个解决方案:运行非常-非常快(我不介意CPU)或花费更长时间,但对CPU的影响较小.基本上,服务器上有8个连接,大约有50%的CPU使用率,这意味着原始的update.php崩溃了。

我尝试添加LOCK TABLES product WRITE、query、UNLOCK TABLES,但是性能提高了0.x秒。更新过程在一个查询中有大约40,000种产品.它花费的时间太长,占用了太多的CPU和锁表很长时间。

我能做些什么?

LE:代码在这里, http://inpromo.ro/update.txt

基本上有9个分销商,有站点类别和分销商类别(必须映射.未映射的类别不会在网站中添加他们的产品),也有制造商也必须进行映射(同样的制造商可以显示为:华硕或华硕组件),如下所示。

LE2: One查询如下所示:

更新产品集stock_status_id=5,quantity=0,status=0,其中status=1或quantity!=0或stock_status_id!=5

它需要2-3秒来完成(根据PHP的microtime()函数),这是一个很大的过程!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-27 12:26:48

由于整个脚本运行在代码块上,我注意到对于所有现有产品,我使用了“插入.在重复的键更新.”在索引表上,如: product_description、product_category、product_to_store (这些表不包含股票、价格等关键数据),整个过程需要额外的90 12内存和大量时间(~12秒)。

现在的逻辑是:

  • 插入product ..。关于重复密钥更新..。
  • “选择p.product_id,p.sku从产品p左加入product_to_store ps在p.product_id=ps.product_id上ps.product_id为NULL和p.status=1”。只是为了加载新的项目
  • 插入product_description,product_category,product_to_store .新产品的细节。
票数 0
EN

Stack Overflow用户

发布于 2014-12-26 11:09:01

是谁触发了这次更新?

1)正常的在线用户

( 2)工作

3)你在政府工作吗?

也许你也可以贴一些代码行或者你正在使用的查询。

PS:不使用OOP并不坏,但在opencart这样的OOP平台上工作却不知道OOP .

阅读这篇文章

票数 0
EN

Stack Overflow用户

发布于 2014-12-28 10:15:51

很抱歉问了一些很平常的问题,你试过这样做吗:

  • 调整mysql和php配置
  • 使用EXPLAIN语句并尝试更改索引
  • 在小的“非联接”查询中拆分“联接”查询,然后查看“长查询日志”,查看瓶颈所在
  • 在更新/插入之前,您是否在表上使用“锁”?(这可能是个愚蠢的问题,因为opencart可以有自己的mysql类来实现这一点,但我真的不知道)
  • 尝试处理一个单独的表(在重复键update上使用non ),然后更新'live‘表(使用一个简单的’插入到table_live选择*从Table_2组中插入‘通过一些您更了解的和bla ))

希望我能给出一些想法。

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

https://stackoverflow.com/questions/27656182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档