遇到过的问题:sql
不少的时候,在Presto上对数据库跨库查询,例如Mysql数据库。这个时候Presto的作法是从MySQL数据库端拉取最基本的数据,而后再去作进一步的处理,例如统计等聚合操做。
举个栗子:数据库
SELECT count(id) FROM table_1 WHERE condition=1;
上面的SQL语句会分为3个步骤进行:
1.Presto发起到Mysql数据库进行查询大数据
SELECT id FROM table_1 WHERE condition=1;
2.对结果进行count计算
3.返回结果
因此说,对于Presto来讲,其跨库查询的瓶颈是在数据拉取这个步骤。若要提升数据统计的速度,可考虑把Mysql中相关的数据表按期转移到HDFS中,并转存为高效的列式存储格式ORC。spa
因此定时归档是一个很好的选择,这里还要注意,在归档的时候咱们要选择一个归档字段,若是是按日归档,咱们能够用日期做为这个字段的值,采用yyyyMMdd的形式,例如20180123.rest
通常建立归档数据库的SQL语句以下:code
CREATE TABLE IF NOT EXISTS table_1 ( id INTEGER, ........ partition_date INTEGER )WITH ( format = 'ORC', partitioned_by = ARRAY['partition_date'] );
查看建立的库结构:orm
SHOW CREATE TABLE table_1; /*Only Presto*/
带有分区的表建立完成以后,天天只要更新分区字段partition_date就能够了,聪明的Presto就能将数据放置到规划好的分区了。it
若是要查看一个数据表的分区字段是什么,能够下面的语句:io
SHOW PARTITIONS FROM table_1 /*Only Presto*/
若是数据被规当到HDFS中,并带有分区字段。在每次查询归档表的时候,要带上分区字段做为过滤条件,这样能够加快查询速度。由于有了分区字段做为查询条件,就能帮助Presto避免全区扫描,减小Presto须要扫描的HDFS的文件数。table
多多使用WITH语句
使用Presto分析统计数据时,可考虑把屡次查询合并为一次查询,用Presto提供的子查询完成。
这点和咱们熟知的MySQL的使用不是很同样。
例如:
WITH subquery_1 AS ( SELECT a1, a2, a3 FROM Table_1 WHERE a3 between 20180101 and 20180131 ), /*子查询subquery_1,注意:多个子查询须要用逗号分隔*/ subquery_2 AS ( SELECT b1, b2, b3 FROM Table_2 WHERE b3 between 20180101 and 20180131 ) /*最后一个子查询后不要带逗号,否则会报错。*/ SELECT subquery_1.a1, subquery_1.a2, subquery_2.b1, subquery_2.b2 FROM subquery_1 JOIN subquery_2 ON subquery_1.a3 = subquery_2.b3;
利用子查询,减小读表的次数,尤为是大数据量的表 具体作法是,将使用频繁的表做为一个子查询抽离出来,避免屡次read。