Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
SQL复制/负载管理的最佳实践_Sql_Database_Mariadb_Load_Database Performance - Fatal编程技术网

SQL复制/负载管理的最佳实践

SQL复制/负载管理的最佳实践,sql,database,mariadb,load,database-performance,Sql,Database,Mariadb,Load,Database Performance,我目前正在运行一个带有Mariadb的Ubuntu服务器。它为一个网站的所有sql请求提供服务(其中包含大量请求) 我们每天有几次将大型CSV文件导入数据库以更新数据。问题是,由于这些csv会破坏数据库(导入大约需要15分钟) 它似乎只使用了4个核心中的1个,但网站(或者更好地说,在这段时间内它的sql请求)仍然慢得可笑。现在我的问题是,我能在这里做些什么来减少对网站的影响? 我曾考虑将数据库复制到另一台服务器,但我希望在导入期间使用相同数量的资源,所以我想这并没有什么实际好处 我考虑的另一件事

我目前正在运行一个带有Mariadb的Ubuntu服务器。它为一个网站的所有sql请求提供服务(其中包含大量请求)

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

它似乎只使用了4个核心中的1个,但网站(或者更好地说,在这段时间内它的sql请求)仍然慢得可笑。现在我的问题是,我能在这里做些什么来减少对网站的影响? 我曾考虑将数据库复制到另一台服务器,但我希望在导入期间使用相同数量的资源,所以我想这并没有什么实际好处

我考虑的另一件事是有两个SQL数据库,在导入过程中,所有请求都应切换到另一个数据库服务器,我基本上每次导入两次,一次在服务器1上(在此期间,服务器2应为站点提供服务)。一旦完成,网站必须切换到服务器1,导入在服务器2上完成。虽然这会起作用,但对于一个非完美的解决方案(比如在从服务器1切换到服务器2的过程中如何处理请求等)来说,这似乎是一个相当大的努力

那么这里有什么解决方案,最好是价格合理的。 欢迎提供所有想法和提示

提前谢谢 致意

Menax

导入是否替换了整个表?如果是,请将其加载到单独的表中,然后将其交换到位。基本上是零停机时间,即在
重命名表期间。有关详细信息,请参阅或可能的话

如果导入正在执行其他操作,请提供详细信息

一个连接使用一个核心,不再使用

更多(来自评论)

这很难优化,因为像
这样的
中有前导通配符。这真的是您需要的吗?目前,该查询必须扫描表

SELECT  id, price
    from  price_history
    WHERE  product_id = 5
    order by  id desc
    limit  1 
这将受益于
索引(product\u id,id,price)
——按此顺序。有了该索引,查询将尽可能接近即时

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

在两台服务器之间切换——仅当数据为只读时。如果您以其他方式修改表,那将是一场噩梦

要完全替换桌子

  • 创建一个新表
  • 填充它
  • 重命名表格以将新表格交换到位

  • (但我仍然不太了解您的处理过程,无法判断这是否是最好的。当您说“切换实时数据库”时,您指的是服务器(计算机)、数据库(模式)还是一个表?

    关于单线程问题,似乎可以通过这里的解决方案解决,肯定会尝试一下。“SQL server”是竞争产品的名称。当提到MariaDB时,请不要使用它;它令人困惑。该网站基本上是一个价格比较网站(不是100%,但我想这是最接近它的东西,没有太多解释)在数据库中有一个包含价格及其产品ID和供应商ID+日期的表。旧价格保存在另一个表中,用于pricehistory。每当我们从任何供应商处获得更新的csv文件,并以新价格导入该文件时,我们都会导入该文件。对于多个供应商,大多数供应商的产品数量在30000到50000之间(每个csv)。由于存在不同的商户,因此不能交换(更新)整个表,只能交换(更新)其中的一部分。@Menaxelius-您如何知道要替换哪些行?(我的建议仍然有效,但“部分”替换会增加一些复杂性。)而且,所有更新是同时进入的吗?还是一次替换一个供应商的数据?是的,这是已知的(基本上该供应商的所有行都有供应商ID),它们一次从一个供应商处替换。因此,如果我理解正确,您建议我将它们导入另一个表中,然后将该供应商的所有条目移动到该站点实际使用的表中?非常感谢您的建议!PS:可能需要先将该表复制到另一个表中,然后执行import在那里,然后重命名表,但现在我还不知道复制部分是否会更少load@Menaxerius-该“替换”是否涉及删除某些行(例如,不再销售的商品)、插入某些行(新商品)和更新某些行(价格变化等)?或…是否没有新行?或是否没有删除的行?
    SELECT  id, price
        from  price_history
        WHERE  product_id = 5
        order by  id desc
        limit  1