V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangyaofei
V2EX  ›  程序员

上亿调数据检索,用什么可以提高效率

  •  
  •   yangyaofei ·
    yangyaofei · 2016-07-07 12:39:22 +08:00 via Android · 6516 次点击
    这是一个创建于 3062 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求是这样的,有现在有千万条数据,以后会增加到上亿调,使用一些字段是文本。 检索的时候是所有字段的组合,而且会用大量的模糊检索。

    找了个外包做这个,用 sphinx 做索引,在 50w 不到的数据中查询,复杂一些的查询会用到 40s ……,问一下这个是 sphinx 的极限了,还是外包不会优化………

    出现的检索有可能是好几个字段都是模糊的,还有各种 and or 什么的……

    29 条回复    2016-07-11 21:21:57 +08:00
    laoyuan
        1
    laoyuan  
       2016-07-07 12:43:37 +08:00
    文本你也说清楚是标题还是内容啊。上 SSD 了吧
    br00k
        2
    br00k  
       2016-07-07 13:05:43 +08:00 via iPhone
    可以试试 elasticsearch
    coolloves
        3
    coolloves  
       2016-07-07 13:12:02 +08:00
    上 es 吧,以下是刚刚实测的,
    111,130,586 hits 的数据,输入关键字也就几秒就检索完了.
    三台 dell730 做成的集群
    windfarer
        4
    windfarer  
       2016-07-07 13:15:12 +08:00 via Android
    elasticsearch 集群
    notgod
        5
    notgod  
       2016-07-07 13:16:49 +08:00 via iPhone
    es 首选 因为你要考虑后期扩容问题
    xiasix
        6
    xiasix  
       2016-07-07 13:21:54 +08:00
    谁告诉你 sphinx 的极限了? 40 秒? 他蒙你的 千万级以内的 sphinx 比 solr 和 els 不管是建立索引还是查询速度都快不止一点半点
    linoder
        7
    linoder  
       2016-07-07 13:24:58 +08:00
    Apache Solr
    JerryKwan
        8
    JerryKwan  
       2016-07-07 13:49:13 +08:00
    没有具体的数据,仅从描述中很难判断出是 Sphinx 的问题还是别的导致的,但基本可以肯定的是外包没把工作做好。
    在做这类工作的时候,不是选择了某个技术框架就万事大吉了。要根据具体问题具体分析。数据量同查询性能并没有直接关系,要看查询语句是怎么组织的。
    wander2008
        9
    wander2008  
       2016-07-07 13:58:28 +08:00 via iPhone
    明显是做的不好,不要怪 sphinx 。
    zado
        10
    zado  
       2016-07-07 14:04:09 +08:00
    用工具什么还要看具体需求,你提供的信息太少。
    islee
        11
    islee  
       2016-07-07 14:17:15 +08:00
    我去才 50W 都这样,明显不是 sphinx 的问题
    gejigeji
        12
    gejigeji  
       2016-07-07 14:20:34 +08:00
    看能不能按某些字段进行分表
    3dwelcome
        13
    3dwelcome  
       2016-07-07 14:28:56 +08:00 via Android
    如果是 50w 篇很长文章的全文索引、那其实也正常。

    优化的关键在于每个索引不能太小、也不能太大、保证引擎搜索 bloom filter 时、最大效率的命中潜在数据集。
    slixurd
        14
    slixurd  
       2016-07-07 14:37:27 +08:00
    全文搜索的耗时和文章长度没有必然联系。文章长度只会减慢 indexing 时的速度,对于查询时来说没什么区别
    SPHINX 没用过我就不说了,至于 LUCENE ,没有用 Bloom Filter ,用的一个 FST ,前缀树的状态机,复杂度是 O(len(query))。

    然后说性能慢,不给 PROFILE 数据,不给查询样例都是坑好吧,怎么看得出来为什么慢....
    lianyue
        15
    lianyue  
       2016-07-07 15:16:03 +08:00
    千万数据 mysql 的 like 也才 10 多秒
    lecher
        16
    lecher  
       2016-07-07 15:28:44 +08:00 via Android
    用 sphinx 建好词库了吗,词库决定了查询的精准度和性能。
    单次查询四十多秒应该是不会用 sphinx 的锅,本质上 sphinx 还是聚合数据源的多条 SQL 语句,做缓存以供加速。如果单次查询需要那么久,说明对应的 SQL 语句执行更久,还可能没建好索引。

    索引词库要维护一份精准的词库,这个最重要。
    内存开了多大,如果内存里面缓存的索引数据足够完整,性能也可以提升很大。
    其次数据源存储位置放 SSD 里面也有性能提升。
    SlipStupig
        17
    SlipStupig  
       2016-07-07 15:34:01 +08:00
    mysql 4G 内存 4CORE CPU 查询在 10 亿数据 50 张表查询 100 个邮箱地址出来,实际就 7-8s 左右, splinx 明显被蒙了
    realpg
        18
    realpg  
       2016-07-07 15:38:28 +08:00
    我有一个 elasticsearch 集群 节点 100 多个 全是各种报废淘汰 PC 机……
    丢在政府的仓库改造的机房里……反正电和网都不要钱
    dong3580
        19
    dong3580  
       2016-07-07 16:23:46 +08:00
    Solr
    isno
        20
    isno  
       2016-07-07 16:33:49 +08:00
    给你个数据参考:
    单台 sphinx 的, 1 核 1G 内存, 虚拟机, 5~10 的指定属性和模糊, 500 万的数据量, 大概在 0.0xs
    qcloud
        21
    qcloud  
       2016-07-07 17:35:22 +08:00
    elasticsearch
    strahe
        22
    strahe  
       2016-07-07 17:37:49 +08:00
    蒙你的
    yangyaofei
        23
    yangyaofei  
    OP
       2016-07-07 20:41:03 +08:00
    @laoyuan 有标题也有内容,很多都是长文本

    @br00k
    @coolloves
    @windfarer
    @notgod 好的,我去谷歌去了~
    @qcloud
    @xiasix 那个外包比较水,他们根本不懂。。。。。
    @linoder 好的,去谷歌了。。。话说这个和 es 区别是啥?

    @3dwelcome 哦~~关键是需求是前台可以利用基本上所有的类似 sql 的语句进行检索,所以很难去针对检索去优化
    @slixurd 其实索引难可以忍受的,关键是建立完索引之后慢。。。还有就是外包更是不懂。我问他们这个问题(瓶颈在哪儿),他们表示不知道。。。。

    @lecher 貌似他们用的是 sphinx for chinese 那个项目。。。我确实能确定是 sphinx 的,他们的查询基本上都是用 sphinx 查到 ID 再用 ID 从数据库中拿数据。。。
    @SlipStupig 是么。。。。我准备明年有时间了自己重新做系统了已经。。。。

    @realpg 这个可以

    @strahe 啊?怎么讲?
    kn007
        24
    kn007  
       2016-07-07 20:52:22 +08:00
    关注
    Suclogger
        25
    Suclogger  
       2016-07-07 23:25:46 +08:00
    虽然目前量级很小,还是要推荐 elasticsearch
    lecher
        26
    lecher  
       2016-07-07 23:38:27 +08:00 via Android
    要处理中文词组建索引,基本上都是 sphinx for Chinese 这个项目做的。
    sphinx 查到 ID ,再根据 ID 去数据库取数据这个思路并没有大问题,上个内存缓存,按 ID 作为 key 存一下,可以节省一些重复查询的性能。

    那你们的业务支持一次 sphinx 查询就取出这个分页的所有数据 ID 了吗?

    再深入一点的调优,词库多大,查询的词在不在词库里面,你这次 40 秒的查询,对应的是 sphinx 的什么查询,这个查询出结果耗时多久。
    最终根据 ID 去数据库取数据又耗时多久。

    外包的团队能不能把执行时间和性能消耗量化出来。如果他们就知道搭个环境直接跑,不知道如何检测分析性能消耗在哪个阶段,那根本没法调优了。
    yangyaofei
        27
    yangyaofei  
    OP
       2016-07-08 01:17:47 +08:00 via Android
    @lecher 外包团队不幸是最后一种…………明年准备自己重做了………
    yaodong
        28
    yaodong  
       2016-07-08 10:11:56 +08:00
    根据实际经验回答, sphinx 完全可以支持这个数据量,并且可以做到很快。
    schoolers
        29
    schoolers  
       2016-07-11 21:21:57 +08:00
    elasticsearch 集群,可以交流一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4806 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 01:15 · PVG 09:15 · LAX 17:15 · JFK 20:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.