【问题标题】:Best Practise for SQL Replication / Load ManagingSQL 复制/负载管理的最佳实践
【发布时间】:2020-10-14 09:35:16
【问题描述】:

我目前正在运行带有 Mariadb 的 Ubuntu 服务器。它为网站的所有 sql 请求提供服务(上面有大量请求)。

我们每天有几次将大型 CSV 文件导入数据库以更新我们的数据。问题是,因为那些 csv 会破坏数据库(导入大约需要 15 分钟)。

它似乎只使用了 4 个核心中的 1 个,但网站(或在那段时间更好的 sql 请求)变得异常缓慢。现在对我来说的问题是我可以在这里做些什么来减少对网站的影响? 我正在考虑将数据库复制到不同的服务器,但我希望在导入期间使用相同数量的资源,所以我猜这里没有真正的好处?

我考虑的另一件事是拥有 2 个 SQL 数据库,在导入期间,所有请求都应切换到另一个数据库服务器,我基本上每次导入两次,一次在服务器 1 上(在此期间服务器 2 应该服务网站)一旦完成,网站必须切换到服务器 1 并在服务器 2 上完成导入。虽然这可行,但对于一个不完美的解决方案来说似乎是相当大的努力(比如在从服务器 1 切换到服务器 2,依此类推。

那么这里有什么解决方案,最好是可以负担得起的。 欢迎所有想法和提示。

提前致谢 最好的问候

梅纳克斯

【问题讨论】:

  • 关于 1 Thread 问题,似乎可以通过这里的解决方案解决,一定要试一试。 dba.stackexchange.com/questions/5666/…
  • “SQL Server”是竞争产品的名称。引用 MariaDB 时请不要使用;这令人困惑。

标签: sql database mariadb load database-performance


【解决方案1】:

导入是否替换整个表?如果是这样,请将其加载到单独的表中,然后将其交换到位。基本上零停机时间,即在RENAME TABLE 期间。详情请见http://mysql.rjweb.org/doc.php/deletebighttp://mysql.rjweb.org/doc.php/staging_table

如果导入正在做其他事情,请提供详细信息。

一个连接使用一个核心,仅此而已。

更多(来自评论)

SELECT  id, marchants_id
    from  products
    WHERE  links LIKE '%https://´www.merchant.com/productsite_5'
    limit  1

由于LIKE 中的前导通配符,这很难优化。这真的是你需要的吗?就目前而言,该查询必须扫描表。

SELECT  id, price
    from  price_history
    WHERE  product_id = 5
    order by  id desc
    limit  1 

这将从INDEX(product_id, id, price) 中受益——按此顺序。使用该索引,查询将尽可能接近即时。

请在交易的其余部分提供更新和插入以及SHOW CREATE TABLE。很可能有一种“批量”操作的方法,而不是一次只计算一个产品价格。这可能将速度提高 10 倍。

两台服务器之间的翻转——仅当数据为只读时。如果您要修改表格,那将是一场噩梦。

为了完全替换一个表,....

  1. 创建一个新表
  2. 填充它
  3. RENAME TABLE 将新表交换到位。

(但是我仍然不能很好地理解您的处理是否最好。当您说“切换实时数据库”时,您指的是服务器(计算机)、数据库(架构)还是只是一张桌子?

【讨论】:

  • 该网站基本上是一个价格比较网站(不是 100%,但我想这是最接近它的东西,没有太多解释)在数据库中有一个包含价格及其产品 ID 和供应商的表身份证+日期。旧价格为 pricehistory 保存在不同的表中,每当我们从任何供应商那里获得更新的 csv 文件时,我们都会将其导入。对于多个供应商,他们中的大多数拥有 30,000 到 50,000 种产品(每个 csv)。而且由于有不同的商家,因此并非整张桌子只交换(更新)其中的一部分。
  • @Menaxerius - 你怎么知道哪些行被替换了? (我的建议仍然有效,但“部分”替换增加了一些复杂性。)而且,所有更新是否同时出现?还是一次替换一个供应商的数据?
  • 是的,这是已知的(它基本上是来自该供应商的所有具有供应商 ID 的行),它们一次被一个供应商替换。因此,如果我理解正确,您建议我将它们导入另一个表中,然后将所有条目从所述供应商移到该站点实际使用的表中?非常感谢您的建议!
  • PS:可能可行的是先将表复制到另一个表,在那里进行导入,然后重命名表,但目前我还不知道复制部分是否会减少负载
  • @Menaxerius - “替换”是否涉及删除一些行(例如,不再销售的商品)、插入一些行(新商品)、更新一些行(价格变化等)?或者......没有新的行吗?还是没有删除行?
猜你喜欢
  • 1970-01-01
  • 2011-10-27
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多