预先感谢您的回答,抱歉我的英语不好,我不是母语人士。
我们实际上是在开发一款带有后端的手机游戏。在这个手机游戏中,我们有一个货币系统,我们会跟踪每笔交易以进行验证。
为了读取用户余额,我们有一个中间表,其中用户余额在每次交易时都会更新,因此用户永远不会直接读取交易表,以减少高流量时的负载。
后台不时读取交易表。
这是事务表的架构:
create table money_money_transaction (
`id` BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
`userID` INT UNSIGNED NOT NULL,
`amount` INT NOT NULL,
`transactionType` TINYINT NOT NULL,
`created` DATETIME NOT NULL,
CONSTRAINT money_money_transaction_userID FOREIGN KEY (`userID`) REFERENCES `user_user` (`id`)
ON DELETE CASCADE
);
我们计划有很多用户,事务表可能会增长到 10 亿行,所以我的问题是:
最佳答案
您可能会考虑 MyRocks(请参阅 http://myrocks.io),这是一个第三方存储引擎,专为快速插入速度和压缩数据存储而设计。我不会建议您应该切换到 MyRocks,因为我没有足够的信息来针对您的工作量做出关于它的明确声明。但我会建议您花时间对其进行评估,看看它是否更适合您的应用程序。
If the database is too large to fit in RAM, does MySQL have some sort of optimisation, storing in RAM only the most read table ?
是的,MySQL(假设是 InnoDB 存储引擎)将部分表存储在缓冲池中的 RAM 中。它将表分解为页面,并在查询请求时将页面放入缓冲池。这就像一个缓存。随着时间的推移,请求最多的页面会保留在缓冲池中,其他页面会被逐出。因此,它或多或少地平衡了尽快为您的大部分查询提供服务。阅读https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool.html获取更多信息。
Will it affect the performance of other tables ?
表没有性能 — 查询有性能。
缓冲池有固定的大小。假设您有六个表需要共享它,它们的页面必须适契约(Contract)一个缓冲池。无法为每个表设置优先级,或为某些表专用缓冲池空间或将它们“锁定”在 RAM 中。所有表的所有页共享同一个缓冲池。因此,当您的查询请求来自不同表的页面时,它们确实会相互影响,因为来自一个表的频繁请求的页面可能会从另一个表中逐出页面。
Does MySQL will be able to scale correctly up to this billion row ?
MySQL 有很多特性可以帮助提高性能和可伸缩性(它们不是一回事)。同样,查询具有性能,而不是表。没有查询的表就放在那里。它是通过不同技术优化的查询。
Knowing we do mostly insert and that the only index is on the id (the id is needed for details) and that there is no "bulk insert" (there will not be 1M insert to do concurrently on this table)
索引确实会增加插入的开销。主键索引是不能去掉的,它是每张表的必要组成部分。但是例如,您可能会发现删除包含索引的 FOREIGN KEY 是值得的。
通常,大多数表的读取次数多于写入次数,因此值得保留一个索引来帮助读取(甚至是使用 WHERE 子句的 UPDATE 或 DELETE)。但是,如果您的工作负载几乎都是 INSERT,那么外键的额外索引可能纯粹是开销,对任何查询都没有任何好处。
Also, we're on a RDS server, so we could switch to Aurora and try a master-master or master-slave replication if needed. Do you think it would help in this case ?
我在 2017 年初研究了 Aurora 的基准测试,发现对于我们测试的应用程序,它不适合高写入流量。您应该始终针对您的应用程序对其进行测试,而不是依赖于互联网上某人的猜测。但我预测目前形式的 Aurora(大约 2017 年)将完全不适合您的全写工作负载。
关于大型只写表上的 MySQL 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48036966/
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到
我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0