V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
isxzlhhh
V2EX  ›  数据库

mysql 字段频繁修改怎么优化

  •  
  •   isxzlhhh · 220 天前 · 2109 次点击
    这是一个创建于 220 天前的主题,其中的信息可能已经有所发展或是发生改变。

    mysql 有张表用的引擎是 MyisAM,这张表有几个字段是被频繁修改的,导致查询和操作都特别慢,请问各位大佬们有什么办法优化嘛

    21 条回复    2024-05-22 22:26:47 +08:00
    j1132888093
        1
    j1132888093  
       220 天前
    数据量,表结构,索引
    edward1987
        2
    edward1987  
       220 天前
    如果有索引,那查询应该不慢,如果没索引 那写入应该不慢。是怎么做到两个操作都慢的,索引加了但是查询的时候用不到??
    leegradyllljjjj
        3
    leegradyllljjjj  
       220 天前
    不要问 问就是索引
    isxzlhhh
        4
    isxzlhhh  
    OP
       220 天前
    @edward1987 引擎是 myisam 每修改一条记录都会产生表锁
    isxzlhhh
        5
    isxzlhhh  
    OP
       220 天前
    就是修改太频繁了 就是每 2 分钟 表里面的两三万条数据 每条数据都要修改一次
    tigerstudent
        6
    tigerstudent  
       220 天前
    多条数据如果没有关联的话,可以考虑分库分表?
    NX2023
        7
    NX2023  
       220 天前
    @isxzlhhh #5 有点哈人,这种场景要不要考虑其他方案存储
    kenvix
        8
    kenvix  
       220 天前
    MyISAM 就不适合频繁改的表,他是用来多读少改的,能不能换 Inno?
    cxsz
        9
    cxsz  
       220 天前
    @isxzlhhh #5 一共两三万条数据的话,考虑下放内存修改,然后定时落库
    celaraze
        10
    celaraze  
       220 天前
    1 ,MyISAM 引擎。
    2 ,频繁且大量写入,2 分钟全表更新一次。

    不知道你的后端应用什么技术栈,我给一些可能的建议:
    [应用] 避免单数据更新,尽量使用 `on duplicate key update` 语句。
    [应用] 避免阻塞主线程,入队列写入,前端可给 toast 告知用户数据正在更新。
    [DB] 索引,毋庸置疑,那列字段经常被查询、更新就加。
    [DB] 查询时要尽量命中索引,少用 `!=` `or` `like` 啥的。
    [DB] 分区表,100 / 1000 / 10000 条数据一个分区这样。

    有个办法是你应用查询的过程,手动执行下,用 `explain` 检查下是不是这个查询经历了全表扫描过程,是的话就优化索引。
    celaraze
        11
    celaraze  
       220 天前
    @celaraze 总的来说,还是从数据库调优角度出发,分别从写入和查询去做优化,如果实在不行,按业务需求我蛮建议你非阻塞。
    yjhatfdu2
        12
    yjhatfdu2  
       220 天前
    为啥不用 innodb 呢? innodb 应该是 mvcc ,读写可以不冲突
    isxzlhhh
        13
    isxzlhhh  
    OP
       220 天前
    @yjhatfdu2
    @kenvix 用 innodb 第一个是他们之前代码可能写的有问题,换成 innodb 线上很容易产生死锁问题,因为有很多定时器都在更新这张表的数据
    第二 innodb 更新数据其实还会更慢点 因为有事务粒度大小的问题
    isxzlhhh
        14
    isxzlhhh  
    OP
       220 天前
    @celaraze 后端采用的是 java 写的 业务有个很奇葩的要求 两分钟这些字段都要更新完 而且还不能影响整个系统
    isxzlhhh
        15
    isxzlhhh  
    OP
       220 天前
    @cxsz 我也在考虑在 redis 里面进行修改 但是在纠结用哪种数据结构 大概有五六个字段要频繁修改 而且我感觉会有并发问题出来 因为系统里面是有多个定时器 而这些定时器又用了多线程去修改 有几率是会出现好几个线程去同时修改同一条数据的问题
    isxzlhhh
        16
    isxzlhhh  
    OP
       220 天前
    我的第一步想法是先换一个阿里云的读写分离的数据库 因为现在项目用的数据库是在服务器上手动装的 而且这台服务器还跑了 java 应用 redis 一台 4 核 8g 的服务器,不知道换了数据库会不会稍微好点
    yjhatfdu2
        17
    yjhatfdu2  
       220 天前
    两张表,写完就切另一张表吧
    lasuar
        18
    lasuar  
       219 天前
    你换 redis 也要改旧代码,不如换 innodb ,解决根本问题。死锁,发现一个解决一个就是了,能有多少死锁?
    encro
        19
    encro  
       219 天前
    换 innodb+mysql8 。行级锁,万一记录多了 instant 可以让你增加字段时不至于影响业务。
    频繁改动,可以考虑 duckdb,redis 之类的内存操作 db 。
    coala
        20
    coala  
       219 天前
    多改动的需求, 又需要索引 这不就是 innodb 解决的问题吗? 主键索引 不就是牺牲一点查询性能 解决了 改动慢的问题, 为啥不试试看, 成本最低的改造方案。
    liuhan907
        21
    liuhan907  
       219 天前
    其实我在想,10w/2min 这个频率算下来不是很高,甚至可以说是低的。为什么会有性能问题?
    @isxzlhhh
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.