Matomo数据库结构

Matomo(之前叫Piwik)主要持久化两种类型的数据:

  • 日志数据:从追踪器获取到的原始数据
  • 归档数据:归档器处理原始数据产生的聚合数据,它被缓存到数据库并用于构建报告。

Matomo也会持久化其它比较简单的数据,包括站点、用户、目标、选项

如果你要在自己的插件中扩展Matomo数据库,也是可行的。

欢迎加入Matomo中文网。需要下载PDF版本,请加入官方QQ群255820112(点击滚动至本页末可扫描二维码),随时提问,有问必答。

日志数据

有四种类型的日志数据,包括访问(Visit)、行为类型(Action Types)、转化(Conversion)、电子商务商品(ecommerce items)。

所有的日志数据持久化都是很简单的:新的数据会以高通量的方式加入到服务器数据集中,更新操作几乎是不存在的,除了访问(visit)数据。

当访问处于活动状态(在线)时,访问数据会被更新。当访问结束的时候,matomo会更新它。

在运算分析数据的时候,原始日志数据会被读取。旧的数据可能会被删除(这取决于你设置的老数据处理选项)。

后台需要保证插入日志数据要越快越好,并且聚合数据不能太慢(当然,快些更好)。

访问

访问(visit)数据存储在log_visit表中。

请注意区分访问和访客,一个访客可以发生多次访问,每次访问之间系统默认间隔30分钟以上,这个配置项(global.ini.php:visit_standard_length = 1800)可以修改。

每次访问包含以下信息:

  • idsite:站点ID

提示:以下字段是从访客(visitor)的角度进行定义的字段,注意字段前缀

  • idvisitor:访客ID(8字节二进制字符),如果你需要其转化成明文,请阅读idvisitor明文转化
  • visitor_localtime: 访客所在时区的本地时间
  • visitor_returning: 首次访客还是回头客,取决于相同idvisitor有无其他访问。
  • visitor_count_visits: 到本次访问为止,当前访客(用idvisitor来标识)一共进行了多少次访问
  • visitor_days_since_last: 距离访客最后一次访问到本次访问已经多少天了(回头客才有值)
  • visitor_days_since_order: 距离访客最后一次下单到本次访问已经多少天了
  • visitor_days_since_first:距离访客第一次访问到本次访问已经多少天了

提示:以下是从访问(visit)的角度进行定义的字段,注意字段前缀

  • visit_first_action_time: 本次访问中第一次页面行为发生的时间
  • visit_last_action_time: 本次访问中最后一次页面行为发生的时间
  • visit_exit_idaction_url: 本次访问中跳出页面的ID(对应log_action表,类型为URL)
  • visit_exit_idaction_name: 本次访问中跳出页面的ID(对应log_action表,类型为页面标题)。提示:同一个网页在log_action表中至少有两条记录,一条是URL类型,一条是页面标题类型。
  • visit_entry_idaction_url: 本次访问中入口页面的ID(对应log_action表,类型为URL)
  • visit_entry_idaction_name: 本次访问中入口页面的ID(对应log_action表,类型为页面标题)。提示:同一个网页在log_action表中至少有两条记录,一条是URL,一条是页面标题。
  • visit_total_actions:本次访问所包含的页面行为总数
  • visit_total_searches:本次访问所包含的站内搜索次数
  • visit_total_events:本次访问所包含的自定义事件数
  • visit_total_time: 本次访问总共耗费的时间
  • visit_goal_converted:本次访问是否有目标转化
  • visit_goal_buyer: 本次访问是否存在用户下单

提示:下面是关于推介网站的字段

  • referer_type: 访客来本站的推介类型. 数值可以为:
    • Common::REFERRER_TYPE_DIRECT_ENTRY = 1:直接访问,无法判定推介类型的默认值。
    • Common::REFERRER_TYPE_SEARCH_ENGINE = 2: 来自搜索引擎,对应的关键词也会被解析
    • Common::REFERRER_TYPE_WEBSITE = 3: 来自于其他非搜索引擎网站
    • Common::REFERRER_TYPE_CAMPAIGN = 6:表示特定的推广渠道
  • referer_name:推介网站的名称,它的值依赖于推介类型referer_type
  • referer_url: 推介网站的网址; 它的值依赖于推介类型referer_type
  • referer_keyword: 如果推介类型是搜索引擎,本字段就是用户的搜索词(由于搜索引擎加密可能获取不到)

提示:下面是访问客户端的相关属性

  • config_id:访问客户端的相关属性运算出的hash值,包括操作系统、浏览器名称、浏览器版本、浏览器语言、IP地址、所有浏览器插件信息。
  • config_os: 客户端的操作系统名称. 参见Device Detector 获取更多信息
  • config_browser_name: 访客浏览器名称. 参见Device Detector 获取更多信息
  • config_browser_version: 访客浏览器版本
  • config_resolution: 访客屏幕分辨率 (eg, ‘1024×768’)
  • config_pdf: 访客浏览器是否可以浏览PDF文件
  • config_flash: 访客浏览器是否可以播放flash
  • config_java: 访客浏览器是否可以运行java
  • config_director:
  • config_quicktime: 访客浏览器是否使用quicktime插件播放媒体文件
  • config_realplayer: 访客浏览器是否可以播放realplayer媒体文件
  • config_windowsmedia: 访客浏览器是否使用windows media播放器播放媒体文件
  • config_gears:
  • config_silverlight: 访客浏览器是否可以运行silverlight程序
  • config_cookie: 访客浏览器是否启用了cookie
  • location_ip: 访客对应的公网IP地址,加密存储。可以 匿名化。可以明文化
  • location_browser_lang:访客浏览器的语言
  • location_country: 访客访问时所在的国家二位字母缩写。由 UserCountry 插件设置。
  • location_region: 访客访问时所在国家的地区二位字母缩写。由 UserCountry 插件设置。
  • location_city: 访客访问时所在城市名称。由 UserCountry 插件设置。
  • location_latitude: 访客访问时所在经度。由 UserCountry 插件设置。
  • location_longitude: 访客访问时所在纬度。由 UserCountry 插件设置。
  • custom_var_k1: 用于扩展访问信息的第一个自定义变量名
  • custom_var_v1: 用于扩展访问信息的第一个自定义变量值
  • custom_var_k2: 用于扩展访问信息的第二个自定义变量名
  • custom_var_v2: 用于扩展访问信息的第二个自定义变量值
  • custom_var_k3: 用于扩展访问信息的第三个自定义变量名
  • custom_var_v3: 用于扩展访问信息的第三个自定义变量值
  • custom_var_k4: 用于扩展访问信息的第四个自定义变量名
  • custom_var_v4: 用于扩展访问信息的第四个自定义变量值
  • custom_var_k5: 用于扩展访问信息的第五个自定义变量名
  • custom_var_v5: 用于扩展访问信息的第五个自定义变量值

有些插件,比如说Provider插件,会向visit表添加更多信息。

表详情

索引 index_idsite_config_datetime用于快速查找和识别回头客。

索引 index_idsite_datetime 用于归档时聚合访问数据。因为日志数据的聚合只在按天归档时发生,此索引帮助Matomo快速找到特定网站在一定时间段内的访问。没有它,日志聚合就需要对log_visit进行全表扫描。

欢迎加入Matomo中文网。需要下载PDF版本,请加入官方QQ群255820112(点击滚动至本页末可扫描二维码),随时提问,有问必答。

访问行为

一次访问会包含多次行为。它们存储在log_link_visit_action 表中。

访问行为包含以下信息:

  • server_time: 行为被追踪时的UTC时间
  • idaction_url: 此次行为对应的URL类型的Action ID
  • idaction_url_ref:本次访问行为的前一个行为对应的URL类型的Action ID
  • idaction_name:此次行为对应的页面标题类型的Action ID
  • idaction_name_ref:本次访问行为前一个行为对应的页面类型的Action ID
  • time_spent_ref_action: 本次行为的前一次行为所耗费的时间
  • custom_var_k1: 为页面自定义变量预留的第一个变量名
  • custom_var_v1: 为页面自定义变量预留的第一个变量值
  • custom_var_k2: 为页面自定义变量预留的第二个变量名
  • custom_var_v2: 为页面自定义变量预留的第二个变量值
  • custom_var_k3: 为页面自定义变量预留的第三个变量名
  • custom_var_v3: 为页面自定义变量预留的第三个变量值
  • custom_var_k4: 为页面自定义变量预留的第四个变量名
  • custom_var_v4: 为页面自定义变量预留的第四个变量值
  • custom_var_k5: 为页面自定义变量预留的第五个变量名
  • custom_var_v5: 为页面自定义变量预留的第五个变量值
  • custom_float: an unspecified float field, mainly used to store the Custom Event value, as well as store the time it took the server to serve this action
  • custom_float: 一个未指定的浮点字段,主要用于存储Custom Event值,以及存储服务器提供此操作所需的时间

表详情

此表idsite和idvisitor列值是从对应的visit拷贝过来的,为的就是避免与log_visit表的联合查询。

索引index_idvisit用于快速查找特定visit对应的action。

The index_idsite_servertime index is used when aggregating visit actions. It allows quick access to the visit actions that were tracked for a specific website during a specific period and lets us avoid a table scan through the whole table.

索引 index_idsite_servertime在对访问行为进行归档时使用。它能够加速获取特定网站在特定时间段内的行为,无需全表扫描。

行为类型表

行为类型,如特定网址或者网页标题,也会被分析。这类分析方便你理解哪些网页与访客更相关。

当遇到新的行为类型时,Matomo会将其持久化到数据库中。

行为类型表名为log_action,包含以下信息:

  • name: 描述行为的字符串。可以是网址、页面标题、渠道活动名称甚至其他任何内容
  • hash: 使用name计算的hash值.
  • type: 行为分类,有以下几种情况:
    • Piwik\Tracker\Action::TYPE_PAGE_URL = 1:  某网页对应的网址
    • Piwik\Tracker\Action::TYPE_OUTLINK = 2: 某网页中外部链接
    • Piwik\Tracker\Action::TYPE_DOWNLOAD = 3: 被追踪网站中对应下载文件的网址。
    • Piwik\Tracker\Action::TYPE_PAGE_TITLE = 4:某网页对应的页面标题。
    • Piwik\Tracker\Action::TYPE_ECOMMERCE_ITEM_SKU = 5: 网站上售卖的商品的编号
    • Piwik\Tracker\Action::TYPE_ECOMMERCE_ITEM_NAME = 6: 网站上售卖的商品的名称
    • Piwik\Tracker\Action::TYPE_ECOMMERCE_ITEM_CATEGORY = 7: 网站上用户购买商品时对应的分类
    • Piwik\Tracker\Action::TYPE_SITE_SEARCH = 8:站内搜索
    • Piwik\Tracker\Action::TYPE_EVENT_CATEGORY = 10: 事件分类 (阅读 Tracking Events用户指南)
    • Piwik\Tracker\Action::TYPE_EVENT_ACTION = 11:事件行为
    • Piwik\Tracker\Action::TYPE_EVENT_NAME = 12:事件名称
    • Piwik\Tracker\Action::TYPE_CONTENT_NAME = 13:内容追踪的名称(阅读 Content Tracking 用户指南和 developer guide)
    • Piwik\Tracker\Action::TYPE_CONTENT_PIECE = 14:内容片段
    • Piwik\Tracker\Action::TYPE_CONTENT_TARGET = 15: 内容目标
    • Piwik\Tracker\Action::TYPE_CONTENT_INTERACTION = 16:内容交互
  • url_prefix当name字段值是URL时,对应的前缀会被移除后再存储。有以下几种情况
    • 0‘http://’
    • 1‘http://www.’
    • 2‘https://’
    • 3‘https://www.’

表详情

索引index_type_hash用来快速查找已经存在的行为类型。

转化

当访问的行为与特定goal的参数匹配时,对应的转化信息会被创建并持久化到数据库。转化的意思是指客户在网站上的行为与我们的预期吻合。Matomo会分析这些吻合,并结合访客的访问路径,帮助分析人员决策:如何引导访客以获得更多我们期望的行为。

转化数据存储在log_conversion表,并由以下信息构成:

  • idvisit: 转化对应的访问ID
  • idsite: 转化对应的站点ID
  • idvisitor: 转化对应的访客ID
  • server_time: 转化被记录时的UTC时间
  • idaction_url: 转化发生时所在的网址对应的Action ID
  • idlink_va: 促成转化的直接行为对应的Action ID
  • referer_visit_server_date:
  • url:导致转化被追踪的网址
  • idgoal: 转化匹配到的目标ID
  • idorder:如果此次转化对应的是下单或者购物车,此字段表示订单号
  • items:如果此次转化对应的是下单或购物车,此字段表示商品的数量
  • revenue: 如果此次转化对应的是下单或购物车,此字段表示订单总金额
  • revenue_subtotal: 如果此次转化对应的是下单或购物车,此字段表示总成本
  • revenue_tax: 如果此次转化对应的是下单或购物车,此字段表示总税额
  • revenue_shipping: 如果此次转化对应的是下单或购物车,此字段表示物流费用
  • revenue_discount: 如果此次转化对应的是下单或购物车,此字段表示折扣总额

表详情

此表中没有被列出来的其他字段都是从visit表复制过来的字段。这样可以避免与log_visit表联合查询造成性能问题。

索引index_idsite_datetime用于聚合归档转化(conversion)数据。它能够加速获取特定网站在特定时间段内的转化数据,无需全表扫描了。

电子商务商品(也叫转化商品)

电子商务商品是用户下单或加入购物车的商品。

电子商务商品存储在log_conversion_item表中,并包含以下信息:

  • server_time:服务器时间
  • idorder:商品所在订单的ID
  • idaction_sku: 包含商品SKU的Action Type表记录对应的ID
  • idaction_name: 包含商品名称的Action Type表记录对应的ID
  • idaction_category: 包含商品分类的Action Type表记录对应的ID
  • idaction_category2: 包含商品分类的Action Type表记录对应的ID
  • idaction_category3: 包含商品分类的Action Type表记录对应的ID
  • idaction_category4: 包含商品分类的Action Type表记录对应的ID
  • idaction_category5: 包含商品分类的Action Type表记录对应的ID
  • price: 商品单价
  • quantity:订单中此商品的数量
  • deleted: 此商品最终是否被从订单中移除

表详情

字段idsite,idvisitor,server_time和idvisit列是从商品对应的转化实体信息中拷贝过来了。这样做也是为了避免联合查询。

索引 index_idsite_servertime在对商品进行归档时使用。它能够加速获取特定网站在特定时间段内的转化商品信息,避免全表扫描。

归档数据

归档数据包括数值指标和报表。数值指标是纯数字的。报表存储在DataTable实例中,并以压缩的二进制字串进行存储。

Archive data is associated with the website ID, period and segment it is for along with the data’s identifying name. All archive data will be queried many times by this information. Currently, the segment is hashed and attached to the end of the metric name. Archive data is also persisted with the current date and time so it is possible to know how old some data is.

归档数据与站点ID,时间段,分段条件一起构成一条记录。通过这些条件,归档数据会被多次获取。目前分段条件被转化成了hash值,然后追加到指标名称的后面。归档数据也会将最新一次归档的日期和时间持久化到数据库中。

所有归档数据包含以下信息:

  • idarchive: 特定网站、特定时间段、特定分段条件的归档数据对应的所有数据共享的ID。一次归档会对应多条记录。
  • name:报表或者数值指标名称。如果分段条件(segment)被指定的话,名称后面还会有一个分段条件对应的hash字串
  • idsite: 归档数据对应的站点ID
  • date1: 归档数据对应的时间段的第一天的日期
  • date2: 归档数据对应的时间段的最后一天的日期
  • period: 归档数据的汇总周期,可以是以下值:
    • 1: 按天
    • 2: 按周
    • 3: 按月
    • 4: 按年
    • 5: 自定义时间段
  • ts_archived:归档数据被缓存时的时间
  • value: 归档数据值。数值指标对应数值,报表对应二进制字段

表详情

归档数据是按月存储的,不存在的月表会被自动创建。比如说2018年1月的归档数据和2018年2月的归档数据存放的表是不同的。

Matomo会创建两种类型的归档表,一个是 archive_numeric类型的表,它用于存储数值指标数据;一个是archive_blob 类型的表,用于存储报表数据。它们的表名都会有年月做后缀,形如archive_numeric_2018_01

archive_numeric*表中

  • 索引index_idsite_dates_period 在查询归档数据时使用。有了它可以根据日期进行快速查询。
  • 索引index_period_archived用于快速查找并删除老的归档数据

archive_blob*表中

  • 索引index_period_archived的使用方法与archive_numeric *表中的类似。
  • archive_blob表不存在加速查询站点、周期和归档时间的索引。原因是系统不会这样查询。取而代之的是先查询 archive_numeric表中的idarchive,然后用这个idarchive在archive_blob进行查询。

其他数据

网站(也叫站点)

站点表中存储的都是与被追踪网站相关的信息。它不会像访问和归档数据一样有那么多的数据,不过它们会经常被查询。

每一次报表请求(要么通过报表API,要么通过Matomo界面)都至少查询一个站点。客户端追踪器在缓存过期的情况下只会更新站点数据。对于大部分的追踪请求来说,站点数据不会从服务器请求(这样可以带来性能上的提升)。

站点信息存储在site表,包含以下字段:

  • idsite: 网站ID
  • name: 网站名称
  • main_url: 网站首页网址
  • ts_created: 创建时间
  • ecommerce1表示电子商务站, 0 表示非电子商务站.
  • sitesearch1 表示存在站内搜索 0表示无站内搜索
  • sitesearch_keyword_parameters:站内搜索时网址中关键词对应的参数名,多个以逗号隔开
  • sitesearch_category_parameters: 站内搜索时网址中分类对应的参数名,多个以逗号隔开
  • timezone: 网站时区
  • currency:网站使用的币种,只有电子商务站才适用
  • excluded_ips:逗号隔开的IP地址列表或IP地址段。来自这些IP的访问会被忽略。
  • excluded_parameters:逗号隔开的参数名列表。这些参数名会从网页网址中去除。
  • excluded_user_agents:逗号隔开的字符串。访问对应的浏览器名称包含这些字符串的话会被忽略。
  • group:分组
  • keep_url_fragment1保留action网址#后面的内容 0不保留

Site entities also contain a list of extra URLs that can be used to access the website. These are not stored within site entities themselves: they are stored in the site_url table.

站点实体可能存在多个域名可以到达它。它们没有被存在site表中,而是存在site_url表中。

Site entity data access occurs primarily through the Piwik\Site class. Anything that cannot be queried through that class can be queried through the SitesManager core plugin.

站点信息的访问主要通过Piwik\Site 类。这个类无法获取到的信息,可以通过SitesManager内核插件。

目标

每个网站都会设置一些目标。目标就是期望访问者在网站上所做的行为。

目标被存储在goal表中,包含以下信息:

  • idsite: 目标所属的站点ID
  • idgoal: 目标的ID,主键
  • name: 目标的名称
  • match_attribute:用于匹配的属性,有以下几个选项:
    • manually:通过手工方式提交转化请求,使用trackGoal
    • url:基于网址判断目标转化.
    • title: 基于网页标题判断目标转化
    • file:基于被下载的文件的名称判断目标转化
    • external_website: 基于外链的网址判断转化
  • pattern:用于检查目标是否匹配的匹配内容
  • pattern_type: 判断目标是否转化的匹配模式
    • contains:包含,当匹配属性包含匹配内容时,则认为有转化
    • exact: 等于,当匹配属性等于匹配内容时,则认为有转化
    • regex: 正则匹配,当匹配属性正则匹配pattern时,则认为有转化
  • case_sensitive1大小写敏感 0 大小写不敏感
  • allow_multiple1 允许一次访问多次转化0 不允许
  • revenue: 一次转化所带来的收入
  • deleted1 此目标是否已经被用户删除 0没有被删除

备注:电子商务和被放弃的购物车目标是两个特殊的目标,它们的ID比较特殊。电子商务网站会自动添加这两个目标。

用户

用户信息存储在user表中。其中包含matomo操作员的信息。

用户信息包含以下列:

  • login: 用户登录名
  • password’: 用户密码的hash值
  • alias:用户别名,用于登陆后显示在界面上
  • email:用户的email地址
  • token_auth: 用户授权码,用于HTTP API调用
  • date_registered: 用户注册时间
  • superuser_access: 用户是否是超级用户

界面和报表接口的每次请求都会读取用户信息。

还有一些用户相关的信息没有存储在user表中,请继续往下阅读。

用户权限

用户可以被允许和禁止访问matomo。针对不同站点,用户的访问级别存储在access表中。

Matomo已经定义了4种类型的权限

Access表包含以下几个字段:

  • login: 用户的登录名
  • access: 用户的权限(view or admin)
  • idsite: 用户的access权限应用在哪个站点。

备注:超级用户权限是存储在用户user表,通过superuser_access来标识。

关于用户权限的更多内容,请阅读Permissions 指南。

选项

选项是就是一个名值对,选项名是一个字符串,选项值是另外一个字符串(可能会更大些,也可能是二进制数据)。每次UI请求和报表API请求都会请求它们。追踪器会缓存相关的选项值,并会在需要更新的时候重新请求。

一些选项会在每次非追踪请求的时候也被加载。这些选项的autoload字段值为1,这些选项都是用于matomo后台应用。