我们向我们的餐桌每个谷歌云SQL指令并将其导入第二代谷歌的Cloud SQL实例。
我们非常高兴地看到我们的数字将在“谷歌硬件”上运行。
压力测试我们的Rails应用与Apache ab
,看到150ms的更高的完成时间后,我们发现的ActiveRecord从30毫秒采取50ms的比在同一页面我们的生产服务器(裸机)更多。
虽然我们更深入地挖掘,真正吹响我们的头脑是简单的计数查询是这样的:
GOOGLE CLOUD SQL - db-n1-standard-4 (4vcpu and 15GB RAM)
1. Cold query
mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
| 3998050 |
+----------+
1 row in set (19.26 sec)
2. Repeat query
mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
| 3998050 |
+----------+
1 row in set (1.16 sec)
SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 10.500000000000 |
+------------------------------------------+
1 row in set (0.00 sec)
然后我可以重复查询多次,性能是一样的。
跑在我的MacBook相同的查询完全相同的转储亲2017年:
MACBOOK PRO 2017
1. Cold query
mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
| 3998050 |
+----------+
1 row in set (1.51 sec)
2. Repeat query
mysql> SELECT COUNT(*) FROM `event_log`;
+----------+
| COUNT(*) |
+----------+
| 3998050 |
+----------+
1 row in set (0,51 sec)
SELECT @@innodb_buffer_pool_size/1024/1024/1024;
+------------------------------------------+
| @@innodb_buffer_pool_size/1024/1024/1024 |
+------------------------------------------+
| 0.125000000000 |
+------------------------------------------+
1 row in set (0,03 sec)
是什么使得它更荒唐的是,你可以在上面看到,我还没有调整从我的MySQL默认安装任何东西,所以它的使用只在我的Macbook RAM 125MB,而谷歌云实例具有的可用RAM 10GB。
我们试图增加谷歌的Cloud SQL实例规模达DB-N1-highmen-8(8vCPU与52GB内存!),以不增加的性能(如果我们从DB-N1-STANDARD-4降低,我们确实看到性能下降)。
最后但并非最不重要的,使用this question我们可以证实,我们的数据库只有46GB,但在导入过程中的谷歌云SQL存储使用率继续增长,直到达到荒谬74GB ......我们不知道这是否是因为二进制日志的(这是对在谷歌云SQL默认和关闭我的本地机器上)。
所以..是不是用在生产谷歌Cloud SQL的人吗? :)
更新:我们使用了完全相同的.SQL转储并加载它变成一个db.r4.large AWS RDS(所以相同的CPU / RAM),并得到了在查询一致0,50s性能,而且还didnt消耗更多的46GB然后在实例。
比较执行计划(在前面加上EXPLAIN
),你可能会发现在超出缓冲池大小配置参数变化所导致的一些显着的实现差异。
我遇到过类似的问题,在上周末建立一个Postgres的Cloud SQL数据库与数据〜100GB的,镜像我的MacBook Pro的本地数据库。性能与我的本地数据库使用索引非常有针对性的选择,但扫描不平凡的数据量查询是2-5x慢。
对比(在MySQL SHOW ALL
我认为)本地和云实例,我注意到一些差异,如SHOW VARIABLES
= 0云SQL VS 2在我的本地实例之间max_parallel_workers_per_gather
的配置结果。
在一个select count(*)...
的情况下,设定max_parallel_workers_per_gather
> 0允许使用一个收集在使用多个并行的工人顺序扫描的结果;设置为零发动机时必须执行一个单一的顺序扫描。对于其他查询,我发现那里平行工人在我的本地数据库使用,比云实例更低的成本和更快的速度相似的趋势。
这只是其中一个促进因素;我敢肯定,挖成的设置会变成了许多这样的解释。这些都是配备管理服务(尽管它会是不错的了这样的参数更多的控制)的权衡。