对于我的创业公司,我自己跟踪所有内容,而不是依靠谷歌分析。这很好,因为我实际上可以拥有ips和用户ID以及所有内容。
这很有效,直到我的追踪表上升了大约200万行。该表名为acts
,并记录:
......如果有的话。
现在,尝试做这样的事情:
SELECT COUNT(distinct ip)
FROM acts
JOIN users ON(users.ip = acts.ip)
WHERE acts.url LIKE '%some_marketing_page%';
基本上永远不会完成。我切换到了这个:
SELECT COUNT(distinct ip)
FROM acts
JOIN users ON(users.ip = acts.ip)
WHERE acts.note = 'some_marketing_page';
但它仍然非常缓慢,尽管有一个指数值得注意。
我显然不是mysql的专业人士。我的问题是:
拥有大量数据的公司如何跟踪渠道转化率等内容?有可能在mysql中做,我只是缺少一些知识吗?如果没有,我可以阅读哪些书籍/博客有关网站如何做到这一点?
答案 0 :(得分:1)
在朝着'尊重'迈进时,2百万行对于表来说仍然是一个相对较小的行。 (因此通常可以实现更快的性能)
正如您所知,前端通配符效率特别低,如果您的应用程序常见这种用例,我们必须找到解决方案。
可能只是您没有正确的索引集。然而,在我继续之前,我想强调的是,虽然索引通常会使用各种SELECT语句来提高DBMS性能,但它会系统地对“CUD”操作的性能产生负面影响(即使用SQL CREATE / INSERT,UPDATE) ,DELETE谓词,即写入到数据库的查询,而不仅仅是读取到它。在某些情况下,索引对“写入”查询的负面影响可能非常显着。
我特别强调索引的矛盾性质的原因在于,您的应用程序似乎将相当数量的数据收集作为其操作的正常部分进行操作,并且您需要在INSERT查询到达时监视可能的降级放慢速度。一种可能的替代方法是将数据收集执行到相对较小的表/数据库中,没有索引或索引非常少,并定期将数据从此输入数据库导入到进行实际数据挖掘的数据库中。 (导入它们之后,可以从“输入数据库”中删除这些行,使其INSERT函数保持小而快。)
另一个问题/问题是关于转换表中行的宽度(列数和这些列的宽度之和)。性能不佳可能与行太宽的事实有关,导致表的叶节点中的行太少,因此需要更深层次的树结构。
回到索引......
鉴于问题中的几个查询,您似乎可以从ip + note索引(这个顺序至少使用这两个键做出的索引)中受益。对索引情况进行了全面分析,坦率地说,这里无法对数据库模式进行可能的审查(没有足够的信息可用于...)但这样做的一般过程是列出最常见的用例和查看哪些数据库索引可以帮助解决这些问题。通过mySQL命令EXPLAIN,可以最初或在添加索引之后收集有关如何处理特定查询的信息。
标准化或非标准化(或两者的结合!),通常也是提高采矿作业性能的可行理念。
答案 1 :(得分:1)
为何加入?如果我们可以假设没有IP使其成为没有相关记录的行为,则您不需要加入:
SELECT COUNT(distinct ip) FROM acts
WHERE acts.url LIKE '%some_marketing_page%';
如果你真的需要JOIN,首先从行为中选择不同的IP可能需要付费,然后将这些结果加入用户(你必须查看执行计划并进行实验,看看这是否更快)。 / p>
其次,使用领先的外卡的LIKE将导致对行为的全表扫描,并且还需要一些昂贵的文本搜索。您有三种选择来改善这一点:
在存储之前将网址分解为组件部分,以便搜索与列值完全匹配。
要求搜索字词显示在网址字段的开头,而不是中间字符。
调查全文搜索引擎,该搜索引擎将对url字段编制索引,使得即使可以对索引执行内部LIKE搜索。
最后,在搜索acts.notes的情况下,如果注释上的索引没有提供足够的搜索改进,我会考虑在笔记上计算和存储整数哈希并搜索它。
答案 2 :(得分:0)