如何解决SQL复制/负载管理的最佳实践
我当前正在运行带有Mariadb的Ubuntu服务器。它为网站提供了所有sql请求(请求量很高)。
我们每天几次将大型CSV文件导入数据库以更新数据。问题在于,由于这些csv会爆炸数据库(导入大约需要15分钟)。
它似乎只使用了4个核心中的1个,但仍然使网站(或在此期间更好的sql请求)变得异常缓慢。现在,我的问题是,在这里我可以做些什么来对网站产生较少的影响? 我当时正在考虑将数据库复制到其他服务器,但是我希望在导入期间使用相同数量的资源,所以我猜这里没有真正的好处吗?
我考虑的另一件事是拥有2个SQL数据库,并且在导入期间,所有请求都应切换到另一台数据库服务器,并且我基本上将每个导入两次,一次在服务器1上进行(在此期间,服务器2应该服务)网站)将网站切换至服务器1,并在服务器2上完成导入。虽然可以,但对于非完美的解决方案(例如请求处理过程中的请求处理方式),这似乎是相当大的努力。从服务器1切换到2,依此类推。
那么这里有什么解决方案,最好是负担得起。 欢迎所有想法和提示。
预先感谢 最好的问候
Menax
解决方法
导入替换是整个表格吗?如果是这样,请将其加载到单独的表中,然后将其交换到位。停机时间基本上为零,即在RENAME TABLE
期间。有关详细信息,请参见http://mysql.rjweb.org/doc.php/deletebig或可能的http://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
中的 leading 通配符,因此很难优化。那真的是您所需要的吗?就目前而言,该查询必须扫描表。
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倍。
两个服务器之间的触发器-仅当数据为只读时。如果要修改表,那将是一个噩梦。
要完全替换表格,....
- 创建一个新表
- 填充
- 重命名表以将新表交换到位。
(但是我仍然不太了解您的处理方式,以至于不能说这是最好的。当您说“切换实时数据库”时,是指服务器(计算机),数据库(架构)还是仅一张桌子?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。