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

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

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

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

    公司项目说明:
    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 表查内容, 查出的内容将达到十百万级
    cholerae
        8
    cholerae  
       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   ·   实用小工具   ·   2768 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:17 · PVG 10:17 · LAX 18:17 · JFK 21:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.