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

有一个关于数据库百万级的问题问一下

  •  
  •   13192262269 · 217 天前 · 3151 次点击
    这是一个创建于 217 天前的主题,其中的信息可能已经有所发展或是发生改变。
    要将废卡,坏卡进行回收(要在海量(百万级)数据里进行查询,然后导出卡信息(过十万级)给制卡商,让制卡商制卡)

    有没有老哥,给个好的思路方案,如何高性能实现上面要求?

    公司项目说明:
    1.一个手机卡资源管理系统,java 语言为主,使用 oracle 数据库
    2.oracle 采用分级存储
    46 回复  |  直到 2019-03-12 10:56:43 +08:00
        1
    13192262269   217 天前
    有没有老哥,给个好的思路?愁死我了
        2
    dangyuluo   217 天前
    你也不说数据库结构,有没有健可以利用,或者是根据什么进行查询。给不出建议。
        3
    dangyuluo   217 天前
    健 => 键
        4
    ilyh   217 天前   ♥ 2
    百万怎么也称不上海量... 随便什么数据库都能 hold 住吧...
        5
    kxjhlele   217 天前 via Android
    百万随便查询一下就出来了吧,数据量也不大
        6
    ysweics   217 天前
    要相信 oracle 的能力
        7
    13192262269   217 天前
    @kxjhlele #5
    @ilyh #4
    应该过千万了
    @dangyuluo #2 根据某字段值去查,两张表 AB,每张表数据百万级,如:在 A 表查出一个值,将这个值放到 B 表查内容, 查出的内容将达到十百万级
        8
    cholerae   217 天前
    原来百万级就是海量了

    起码定义下你说的高性能是多高吧
        9
    hellojinjie   217 天前
    你要说明你的查询要在多少时间内完成啊?
    如果只要在十秒内完成的话,不是很简单的事情嘛?
        10
    13192262269   217 天前
    @cholerae #8 部门要求是,秒查出来想要的几十万信息,我想问一下,如何做到 ,菜鸟一枚请教一下
        11
    13192262269   217 天前
    @hellojinjie #9 十秒内可以接受
        12
    thesharjah   217 天前
    直接写 sql 查就行了 10s,扫个全表够了
        13
    jingxyy   217 天前   ♥ 1
    千万级只要索引建得合理也是妥妥的,用在 oltp 业务上都没啥问题,更合况你这听起来更像是 olap 业务,如果确实是 olap (比如制卡商一天查一次,不需要实时),那就更容易了,每天在旧表跑一遍过滤出结果放新表里,让查询请求查新表。

    这个数据对于商业数据库来说真不算什么,你要不先用直接的思路试试,看看能不能达到要求,如果不能把问题说一下(比如用了 10 秒,你希望 1 秒以内,或者机器查不出来内存爆了之类的),具体的操作说一下(比如表的 schema,查询使用的 sql )大家才好帮你研究瓶颈在哪以及解决方案。
        14
    13192262269   217 天前
    @thesharjah #12 @jingxyy #13 我这边扫到 67 万就出现了 out of memory 已经设置最大内存
        15
    jingxyy   217 天前
    方便直接上代码么 关键字段脱个敏啥的 你现在说的完全没法定位问题= =
        16
    blless   217 天前 via Android
    几十 W 数据是带宽跟 IO 问题了吧…
        17
    JamesR   217 天前
    才区区百万级,搞笑,不行把数据导入到性能好的本机台式电脑上再处理。
        18
    no1xsyzy   217 天前
    百万级不是 Excel 都能处理?
        19
    1762628386   217 天前
    没啥问题 不加索引都没问题
        20
    daozhihun   217 天前 via Android
    百万级直接关系数据库加索引就行了
        21
    gstqc   217 天前 via Android
    千万级只能算小小小小小数据
        22
    smeraldo   217 天前
    @13192262269 java 导出 oom ?分批吧
        23
    iphper993   217 天前
    百万千万都是小数据啦
    @13192262269 你把数据都查出来用代码处理吗?不能用条件过滤呀?
        24
    opengps   217 天前 via Android
    数据量确实不算大,难在索引上,合理的索引,搭配 SSD 提高速度,应该够用
        25
    jadec0der   217 天前
    http://www.sqlfiddle.com/

    你能建个 fiddle 么,这空口说谁能给出优化建议
        26
    zarte   217 天前
    现在服务器上建索引试下,再来发帖求助。。。
        27
    Shynoob   217 天前
    百万级 如果固态的话 简单的索引 很快的
        28
    Navee   217 天前
    百万级 Mysql 处理起来小儿科
    更不要谈 Oracle 了
        29
    sigup   217 天前
    百万行用 txt 读到内存里都能处理。。。
        30
    taaaang   217 天前
    固态硬盘, 索引, 你先跑一下试试再说
        31
    oneonesv   217 天前
    千万也不多啊 有个索引 10 秒足够
    你一下全读内存肯定不够,追加写即可
        32
    lauix   217 天前
    建个索引 百万 跟玩一样。
        33
    Joyboo   217 天前
    百万。。我怀疑楼主少了一个“亿”字
        34
    mkeith   217 天前 via iPhone
    数据库 oom,还是你的程序啊?
        35
    wmhx   217 天前
    你就不会写个 for 循环分 N 次么?
        36
    wind3110991   217 天前   ♥ 2
    上面有些回答真是要奔溃,很讨厌回答打个反问号,又不给实际解决方案和思路。。
    ( 1 )要理解 Mysql 恰恰就是适合处理百 /千万级别以下的数据量;
    ( 2 )检查你的表是什么存储引擎的,是 InnobDB 还是 Mysiam。查询效率上 Mysiam 支持全文索引,查询时性能也要强于 InnobDB,如果你们的数据是一次性的导入,基本都是批量更新的话,可以使用 Mysiam。但是如果更新的比较频繁的话,且要使用事务时,考虑使用 InnobDB。
    ( 3 )对于慢查询问题:show create table, 查看你表当前的索引,并且是否有主键。看你的情景,是要在百万中选出坏的,那么大致会有状态字段,看一下这个字段是否是作为单列索引存在于你的表中,如果没有,新建一个同样的表,加上索引,然后把数据拷贝过去,然后变更换表(千万不要在老表加索引,容易导致雪崩)。
    ( 4 )上 10W 数据的表,如果有频繁删除和更新,一定要记得定期做表的优化,Mysiam 的表可以用 optimize,InnobDB 的表用 ALTER TABLE table_name ENGINE = Innodb。因为表在删除数据必然会在数据文件中造成不连续的空白空间,而当再次插入数据时,这些空白空间则会被利用起来,数据的存储位置会不连续,导致大量空间碎片。因此要定期做表优化。
    ( 5 )查看 DB 机器机型和配置,是否性能不足是机器配置不够高导致的,数据库操作的性能主要瓶颈在于 I/O。
    ( 6 )尽量给 DB 做主从和集群( MariaDB )。

    以上就是能想到的最基本的几个点。
        37
    wind3110991   217 天前
    笔误。。是 MyISAM 不是 MySiam
        38
    gz911122   217 天前
    @wind3110991 然而你说上面人回复的不对却没发现楼主根本不是 mysql...而是 oracle
    百万级对于 oracle 随便搞也能在 10 秒内完成,单表
        39
    gz911122   217 天前
    @wind3110991 至于为什么不给解决方案与思路
    因为楼主根本没说清楚自己的问题
        40
    jzmws   217 天前
    有什么好的 oracle 分表方案吗? 一个上亿的数据
        41
    yqsas   217 天前 via iPhone
    sharding-jdbc
    @jzmws
        42
    wangluofansi   217 天前
    给你几个建议:
    out of memory 从两方面优化:①只查询所需字段而不是 select *,如 select card_info from card_table ;②分批,假设每次查询一万条记录,如果有自增 id,那么可以这样查询,select id, card_info from card_table where id > last_id limit 10000,其中 last_id 是上次查询出来的最大 id ;
    索引方面优化:这个本来需要根据表结构和查询条件来,但是可以先简单粗暴地对 where 涉及字段建索引,explain 一下看看效果。
        43
    beggarvip   217 天前 via Android
    几百万导内存里,自建数据结构,哈希,或堆,或建树...等等,几十万查询,应该在一秒内
        44
    wangluofansi   217 天前 via Android
    对了,分批的时候需要 order by id
        45
    hhhzccc   216 天前
    直接写 sql 干起来!
        46
    moxunpw   216 天前
    百万的数据,没啥压力吧。。。我现在 3000w+数据用 MySQL 查 SQL 也好好的。。。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1156 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 18:09 · PVG 02:09 · LAX 11:09 · JFK 14:09
    ♥ Do have faith in what you're doing.