有一个关于数据库百万级的问题问一下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问时复制粘贴 AI 生成的内容
13192262269
V2EX    程序员

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

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

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

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

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

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

    你能建个 fiddle 么,这空口说谁能给出优化建议
    zarte
        26
    zarte  
       2019-03-11 16:29:06 +08:00
    现在服务器上建索引试下,再来发帖求助。。。
    Shynoob
        27
    Shynoob  
       2019-03-11 16:30:30 +08:00
    百万级 如果固态的话 简单的索引 很快的
    Navee
        28
    Navee  
       2019-03-11 16:35:20 +08:00
    百万级 Mysql 处理起来小儿科
    更不要谈 Oracle 了
    sigup
        29
    sigup  
       2019-03-11 16:37:44 +08:00
    百万行用 txt 读到内存里都能处理。。。
    taaaang
        30
    taaaang  
       2019-03-11 16:48:53 +08:00
    固态硬盘, 索引, 你先跑一下试试再说
    oneonesv
        31
    oneonesv  
       2019-03-11 16:52:59 +08:00
    千万也不多啊 有个索引 10 秒足够
    你一下全读内存肯定不够,追加写即可
    lauix
        32
    lauix  
       2019-03-11 16:56:22 +08:00
    建个索引 百万 跟玩一样。
    Joyboo
        33
    Joyboo  
       2019-03-11 17:09:40 +08:00
    百万。。我怀疑楼主少了一个“亿”字
    mkeith
        34
    mkeith  
       2019-03-11 17:41:37 +08:00 via iPhone
    数据库 oom,还是你的程序啊?
    wmhx
        35
    wmhx  
       2019-03-11 18:25:43 +08:00
    你就不会写个 for 循环分 N 次么?
    wind3110991
        36
    wind3110991  
       2019-03-11 19:16:34 +08:00   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 )。

    以上就是能想到的最基本的几个点。
    wind3110991
        37
    wind3110991  
       2019-03-11 19:18:22 +08:00
    笔误。。是 MyISAM 不是 MySiam
    gz911122
        38
    gz911122  
       2019-03-11 21:07:26 +08:00
    @wind3110991 然而你说上面人回复的不对却没发现楼主根本不是 mysql...而是 oracle
    百万级对于 oracle 随便搞也能在 10 秒内完成,单表
    gz911122
        39
    gz911122  
       2019-03-11 21:08:11 +08:00
    @wind3110991 至于为什么不给解决方案与思路
    因为楼主根本没说清楚自己的问题
    jzmws
        40
    jzmws  
       2019-03-11 21:25:23 +08:00
    有什么好的 oracle 分表方案吗? 一个上亿的数据
    yqsas
        41
    yqsas  
       2019-03-11 22:10:24 +08:00 via iPhone
    sharding-jdbc
    @jzmws
    wangluofansi
        42
    wangluofansi  
       2019-03-11 22:47:02 +08:00
    给你几个建议:
    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 一下看看效果。
    beggarvip
        43
    beggarvip  
       2019-03-11 22:56:01 +08:00 via Android
    几百万导内存里,自建数据结构,哈希,或堆,或建树...等等,几十万查询,应该在一秒内
    wangluofansi
        44
    wangluofansi  
       2019-03-11 22:56:22 +08:00 via Android
    对了,分批的时候需要 order by id
    hhhzccc
        45
    hhhzccc  
       2019-03-12 10:38:58 +08:00
    直接写 sql 干起来!
    moxunpw
        46
    moxunpw  
       2019-03-12 10:56:43 +08:00
    百万的数据,没啥压力吧。。。我现在 3000w+数据用 MySQL 查 SQL 也好好的。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5775 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 02:13 PVG 10:13 LAX 18:13 JFK 21:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86