如何利用ClickHouse高速汇总查询MySQL数据

如何利用ClickHouse高速汇总查询MySQL数据,第1张

直连到MySQL的功能现在已被添加到ClickHouse中。所以可以直接从ClickHouse查询MySQL表中的数据。 ClickHouse是一个超高性能的海量数据快速查询的分布式实时处理平台,在数据汇总查询方面(如GROUP BY),ClickHouse的查询更快,因此通常情况下在MySQL上进行聚合。 下面是在自己的虚拟环境中做的测试记录。既然是虚拟环境非生产环境,请看参考应用级别,而不是严格的测试。 正确准备和测试大约1000万个数据项。 执行脚本以创建样本数据。这是约500 MB。在MySQL中创建一个表并导入它。 由于似乎字符串数据比数字值更容易汇总,所以内容是数字的,但它们是可变的类型。 然后执行计算 *** 作。 用BLOB类型做GROUPBY似乎很慢。 您可以在ClickHouse上使用MySQL数据,只需在下面的表格中指定它,而不是表名。 启动ClickHouse客户端并进行测试。 如果您在启动时不添加--multiline选项,则不会放置多行查询,因此请继续。SELECT      data1,      COUNT(*) FROM mysql('localhost','mikage','testdata','mikage','')  GROUP BY data1 ┌─data1─┬─COUNT()─┐ │    4│1999013│ │    3│1998988│ │    2│1999993│ │    5│2001553│ │    1│2000453│ └───────┴─────────┘ 5 rows in set. Elapsed: 2.685 sec. Processed 10.00 million rows,40.00 MB(3.72 million rows/s.,14.90 MB/s.)  SELECT      data2,      COUNT(*) FROM mysql('localhost','mikage','testdata','mikage','')  GROUP BY data2 ┌─data2─┬─COUNT()─┐ │6    │  999786│ │8    │1001805│ │9    │1001438│ │3    │1000357│ │2    │1000648│ │4    │  998349│ │5    │  998889│ │10    │  999424│ │1    │1000530│ │7    │  998774│ └───────┴─────────┘ 10 rows in set. Elapsed: 2.692 sec. Processed 10.00 million rows,101.00 MB(3.71 million rows/s.,37.52 MB/s.)  SELECT      data3,      COUNT(*) FROM mysql('localhost','mikage','testdata','mikage','')  GROUP BY data3 -- 结果省略 100000 rows in set. Elapsed: 5.236 sec. Processed 10.00 million rows,138.89 MB(1.91 million rows/s.,26.52 MB/s.)  SELECT      data1,      uniqExact(data5) FROM mysql('localhost','mikage','testdata','mikage','')  GROUP BY data1 ┌─data1─┬─uniqExact(data5)─┐ │    4│          1811674│ │    3│          1812072│ │    2│          1812503│ │    5│          1814106│ │    1│          1813005│ └───────┴──────────────────┘ 5 rows in set. Elapsed: 12.944 sec. Processed 10.00 million rows,198.89 MB(772.55 thousand rows/s.,15.37 MB/s.)  -- ClickHouse有一个函数来粗略计算一个唯一的数字,所以让我们来计算一下。 在MySQL中,相当耗时的查询也可以在很短的时间内处理。 重复统计时,最好将数据复制到ClickHouse一次。 如果您复制它,后续查询将更快。 建议暂时使用StripeLog引擎。 如果您有一个主键,您可能还想要使用MergeTree表。这是在ClickHouse中最常用的引擎。 有必要用ORDER BY指定数据的排序顺序(即使有重复也没有问题)。 我会尝试以前的查询。以下是StripeLog引擎的测试结果。 测试耗时总结如下: 我认为这个错误很大,因为它在VM环境下仅测试了一次 从左边开始为,(1)MySQL中的时间 (2) ClickHouse从MySQL读取和处理数据的时间 (3) 在ClickHouse上处理复制数据的时间。 执行查询 MySQL处理时间 (秒) MySQL->ClickHouse处理时间 (秒) ClickHouse处理时间 (秒) groupby(data1) 3.22 2.685 0.071 groupby(data2) 4.01 2.692 0.177 groupby(data3) 212.82 5.236 0.779 groupby(data1)+uniq(data5) 183.56 12.944 1.725 groupby(data1)+uniq(data5)概算 (无此功能) 6.026 0.285当引用MySQL数据时,如果没有对应于ClickHouse的类型,它似乎是String类型。 没有相应的类型如Decimal类型,所以它也是String类型。 如果你想把它作为一个数值,精度将会改变,但是似乎有必要在MySQL端保持Double类型。 而且,Date和DateTime类型在MySQL和ClickHouse之间的范围也是不同的。 ClickHouse日期类型是1970 - 2038年之间。 如果有超出范围的数据,可能需要使其成为字符串类型,按年份,月份,日期分列,并将其作为数值复制。 参照源码如下:https://github.com/yandex/ClickHouse/blob/9965f5e357f1be610608a51dc7a41f89c2321275/dbms/src/TableFunctions/TableFunctionMySQL.cpp#L37MySQL类型 ClickHouse 类型 参考 tinyint    UInt8 / Int8 smallint    UInt16 / Int16 int / mediumint    UInt32 / Int32 bigint    UInt64 / Int64 float    Float32 double    Float64 dateDate    有可以表达的范围差异 datetime    DateTime有可以表达的范围差异 timestamp    DateTime binaryFixed    String 除上述以外    String

在已有的 MySQL 服务器之上使用 Apache Spark (无需将数据导出到 Spark 或者 Hadoop 平台上),这样至少可以提升 10 倍的查询性能。使用多个 MySQL 服务器(复制或者 Percona XtraDB Cluster)可以让我们在某些查询上得到额外的性能提升。你也可以使用 Spark 的缓存功能来缓存整个 MySQL 查询结果表。

思路很简单:Spark 可以通过 JDBC 读取 MySQL 上的数据,也可以执行 SQL 查询,因此我们可以直接连接到 MySQL 并执行查询。那么为什么速度会快呢?对一些需要运行很长时间的查询(如报表或者BI),由于 Spark 是一个大规模并行系统,因此查询会非常的快。MySQL 只能为每一个查询分配一个 CPU 核来处理,而 Spark 可以使用所有集群节点的所有核。在下面的例子中,我们会在 Spark 中执行 MySQL 查询,这个查询速度比直接在 MySQL 上执行速度要快 5 到 10 倍。

另外,Spark 可以增加“集群”级别的并行机制,在使用 MySQL 复制或者 Percona XtraDB Cluster 的情况下,Spark 可以把查询变成一组更小的查询(有点像使用了分区表时可以在每个分区都执行一个查询),然后在多个 Percona XtraDB Cluster 节点的多个从服务器上并行的执行这些小查询。最后它会使用map/reduce 方式将每个节点返回的结果聚合在一起形成完整的结果。

MySQL的查询速度,一般可以分为表的大小和查询的模式:

(1)如果表很小,比如只有几百行数据,MySQL的查询速度基本上不受索引影响,可以很快地执行查询。

(2)如果表较大,可以通过使用索引和其他优化技术来大幅度提高MySQL的查询速度。

Oracle的查询速度,也可以分为查询的模式和表的大小:

(1)如果表相对较小,Oracle的查询速度可以通过建立索引和其他优化技术,大大提高查询的性能。此外,Oracle还可以使用特殊的结构,如索引组合,来提高查询的效率。

(2)如果表较大,Oracle也可以通过建立索引和其他优化技术来提高查询的性能。Oracle还支持多表查询和分布式查询,以加快查询速度。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/7351409.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存