经历了前两轮优化之后,saiku由不可使用,优化到可以使用,不过在分析大量日志数据的时候,还有顿卡的感觉!继续观察背后执行的Sql,决定将注意力关注到索引上面!

日志的主要使用场景是:固定日期维度的数据分析,也就是说where条件一定跟着日期等于某一天,那么纠结的是:每个字段都建立索引,还是和日期建立联合索引。归结到底就是单个字段的索引效率与联合索引的效率优劣对比!

Postgresql数据表:saiku_search_detail

表结构:

CREATE TABLE test.saiku_search_detail
(
rpt_date date,
from_area_id bigint,
from_value_id bigint,
in_track_id bigint,
gid character varying,
current_city_id bigint,
dist_city_id bigint,
category_name_id bigint,
page_id bigint,
utmr_page_id bigint,
num bigint,
id bigint,
partner smallint
)

条数:8,510,490。大概851万

测试步骤:

一、裸表

对一个日期进行查询:

1.1 单个条件

select
count(1)
from test.saiku_search_detail
where rpt_date = '2016-05-13'

结果:1110ms

"Aggregate  (cost=160934.85..160934.86 rows=1 width=0)"
" -> Seq Scan on saiku_search_detail (cost=0.00..160816.78 rows=47230 width=0)"
" Filter: (rpt_date = '2016-05-13'::date)"

1.2 两个条件

select
count(1)
from test.saiku_search_detail
where rpt_date = '2016-05-13'
and from_area_id = 135

结果:1782ms

"Aggregate  (cost=184432.32..184432.33 rows=1 width=0)"
" -> Seq Scan on saiku_search_detail (cost=0.00..184431.73 rows=236 width=0)"
" Filter: ((rpt_date = '2016-05-13'::date) AND (from_area_id = 135))"

没有任何异议,0个索引!

二、对两个字段分别添加索引:

--btree索引
CREATE INDEX saiku_search_detail_from_area_id_idx
ON saiku_search_detail
USING btree
(from_area_id);
--hash索引
CREATE INDEX saiku_search_detail_rpt_date_idx
ON saiku_search_detail
USING hash
(rpt_date);

2.1 单个条件

select
count(1)
from saiku_search_detail
where rpt_date = '2016-05-13'

结果:83ms

"Aggregate  (cost=8.02..8.03 rows=1 width=0)"
" -> Index Scan using saiku_search_detail_rpt_date_idx on saiku_search_detail (cost=0.00..8.02 rows=1 width=0)"
" Index Cond: (rpt_date = '2016-05-13'::date)"

使用了索引

2.2 两个条件

select
count(1)
from saiku_search_detail
where rpt_date = '2016-05-13'
and from_area_id = 135

结果:149ms

"Aggregate  (cost=8.02..8.03 rows=1 width=0)"
" -> Index Scan using saiku_search_detail_rpt_date_idx on saiku_search_detail (cost=0.00..8.02 rows=1 width=0)"
" Index Cond: (rpt_date = '2016-05-13'::date)"
" Filter: (from_area_id = 135)"

使用了一个索引,第二个索引没有生效。尝试修改sql的条件顺序:

select
count(1)
from saiku_search_detail
where from_area_id = 135
and rpt_date = '2016-05-13'

结果一样!这说明在Postgresql里面,建立两个索引字段,只会一个起作用!

三、建立联合索引

--复合索引,两个字段都添加索引
CREATE INDEX saiku_search_detail_rpt_date_from_area_idx
ON test.saiku_search_detail
USING btree
(rpt_date, from_area_id);

3.1 单个条件查询&建立索引的第一个字段

select
count(1)
from test.saiku_search_detail
where rpt_date = '2016-05-13'

结果:66ms

"Aggregate  (cost=47843.00..47843.01 rows=1 width=0)"
" -> Bitmap Heap Scan on saiku_search_detail (cost=2220.63..47362.94 rows=192025 width=0)"
" Recheck Cond: (rpt_date = '2016-05-13'::date)"
" -> Bitmap Index Scan on saiku_search_detail_rpt_date_from_area_idx (cost=0.00..2172.62 rows=192025 width=0)"

可见使用了部分索引

3.2 两个条件查询

select
count(1)
from test.saiku_search_detail
where rpt_date = '2016-05-13'
and from_area_id = 135

结果:65ms

"Aggregate  (cost=46124.99..46125.00 rows=1 width=0)"
" -> Bitmap Heap Scan on saiku_search_detail (cost=1509.67..45857.37 rows=107047 width=0)"
" Recheck Cond: ((rpt_date = '2016-05-13'::date) AND (from_area_id = 135))"
" -> Bitmap Index Scan on saiku_search_detail_rpt_date_from_area_idx (cost=0.00..1482.90 rows=107047 width=0)"

使用了索引

总结

  • 废话:如果两个字段做为筛选条件,那么联合索引最优。
  • 收益:在日志分析过程中,除了日期的单个字段做为索引,其他的单个字段索引都不起作用,应该删除
  • 纠结:仅仅在日期建立单个索引,还是建立多个包含日期的复合索引?根据使用场景自己决定吧

saiku之行速度优化(三)的更多相关文章

  1. 【SQL server初级】数据库性能优化三:程序操作优化

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 数据库性能优化三:程序操作优化 概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少 ...

  2. dWebpack编译速度优化实战

    当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...

  3. MySQL优化三(InnoDB优化)

    body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...

  4. Tone Mapping算法系列二:一种自适应对数映射的高对比度图像显示技术及其速度优化。

    办公室今天停电,幸好本本还有电,同事们好多都去打麻将去了,话说麻将这东西玩起来也还是有味的,不过我感觉我是输了不舒服,赢了替输的人不舒服,所以干脆拜别麻坛四五年了,在办公室一个人整理下好久前的一片论文 ...

  5. App架构师实践指南六之性能优化三

    App架构师实践指南六之性能优化三 2018年08月02日 13:57:57 nicolelili1 阅读数:190   内存性能优化1.内存机制和原理 1.1 内存管理内存时一个基础又高深的话题,从 ...

  6. MySQL性能优化(三):索引

    原文:MySQL性能优化(三):索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbi ...

  7. [转]Asp.net mvc 网站之速度优化 -- 页面缓存

    网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 — 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...

  8. web访问速度优化分析

    请求从发出到接收完成一共经历了DNS Lookup.Connecting.Blocking.Sending.Waiting和Receiving六个阶段,时间共计38ms.请求完成之后是DOM加载和页面 ...

  9. 记一次cocos项目的加载速度优化

    半个月前,我们用cosos creator做了一个简单的小游戏,也许算不上小游戏吧..一边学cocos,一边做,几经波折后终于上线了.然鹅,功能是实现了,但是加载速度十分感人(毕竟没经验嘛,无辜脸). ...

随机推荐

  1. Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填、禁用以及可见

    我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置.   一.动态设 ...

  2. 享受LINQ:判断一组文字是否在字符串中同时出现的最简单方法

    需求是这样的:不允许在一个字符串中同时出现"博", "客", "园", "团", "队"这5个文字. ...

  3. Try..Finally..相信自己的眼睛

    问题提出 try { return x; } finally { x = null; } 上面这段代码到底怎么执行的? try..catch..finally 介绍 在MSDN中,try..catch ...

  4. Nim教程【五】

    妈蛋,花了两天时间才搞定博客园的API, 比预期的时间整整多了1天, 不管怎么说,总算把博客园的客户端搞定了 这篇文章就是用博客园的客户端发布的, 先贴张图,给大家看看, 后面我会和博客园的领导商量一 ...

  5. [.NET 即时通信SignalR] 认识SignalR (一)

    ASP .NET SignalR[1] 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知 ...

  6. BlueDream.js(蓝梦)——jQuery网站使用引导插件

    小菜在前端世界游荡有些时间了,常见的插件多少有些了解,但却很少看到用户引导插件. 所谓用户引导插件,就是在第一次使用某个网站时,会弹出一些小动画,告诉你网站的基本使用方法,帮你快速入门. 这应该是个常 ...

  7. C# VS JAVA 差异 (未完待续)

    1. 静态构造函数 C#中有静态构造函数, Java中没有静态构造函数.其实Java中有一个类似静态构造函数的东东,称作静态初始化,或者静态代码块,可以通过这样的代码实现相同的功能: 但是Java中静 ...

  8. ubuntu14.04中文楷体变默认字体

    使用ubuntu以来,最让人头疼的事情就是在英文系统里面使用中文,一般中文字体都很难看,要么有锯齿,要么就是楷体.经过网上搜索找到一堆方法.一个个尝试之后觉得以下方式是最简单有效的. 1.安装font ...

  9. SVM=LASSO?

    SVM和LASSO是机器学习里两个非常经典的模型,每个模型都有大量的文献进行研究.其中去年出版的这本书——<Regularization, Optimization, Kernels, and ...

  10. iOS开发-友盟分享(3)

    iOS 友盟分享 这个主要是提到如何通过友盟去自定义分享的步骤: 一.肯定要去友盟官网下载最新的SDK包,然后将SDK导入到你的工程文件夹里面去: 二.注册友盟账号,将你的APP添加到你的账号里面然后 ...