遇到過的問題: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。