V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
hhhhhh123
V2EX  ›  MySQL

mysql online DDL 时间很长,咋整,数据量不多,就 30W

  •  
  •   hhhhhh123 · 23 小时 8 分钟前 · 853 次点击

    下面是说明和当时场景
    mysql 版本 8.0+
    当初设计的时候还是欠考虑了。 唉~
    sql 中的 date() 函数用的时候一时爽, 现在头大。

    我自己的 app 基本上所有的时间查询我都使用了 date 函数 QAQ
    现在哭着改代码 QAQ ~
    比如

    select uid, balance, create_time from day_check_in where date(create_time) = date(%(入参时间)s) and uid = '123';
    

    近期想优化接口,使用 EXPLAIN 一看头皮发麻, 虽然目前数据量不多,但是很难看。

    当我翻看文档和搜索后发现 可以使用 online DDL 创建索引的时候 可以尽可能的不影响 CURD 操作,不过一些 特殊的 sql 还是会影响,会等待创建索引后才能执行一些查询。 不过这个问题不大,因为我可以避开这个时间段!

    后面我执行了

    ALTER TABLE balance_records ADD INDEX index_uid_create_time (uid, create_time)
    

    发现执行了 5 分钟还是没有执行成功。 使用 SHOW PROCESSLIST; 查看 sql 的运行情况,发现没有什么 sql 和创建索引 sql 冲突, 意味着 创建索引 sql 还在执行。

    我以为是数据量大的原因, 当我把这个表所有的数据拷贝到 test 库中, 我执行了 创建索引的指令,结果 2 秒就执行完了。
    我想知道为啥?
    目前一直没有找到问题所在, 我已经尝试了两个表,拷贝的表单都是几秒钟就创建完成了! 唯独开发环境的表没有执行成功。
    目前唯一能想到的办法就是在夜深人静的时候,进行停止服务,再执行创建索引操作,也不知道行不行。

    有没有大佬知道 为啥我拷贝的表执行几秒钟就执行完了。

    12 条回复    2025-01-09 16:16:34 +08:00
    bobobobob
        1
    bobobobob  
       22 小时 50 分钟前
    有在线 DDL 的库的,允许数据库一边提供服务,一边在线 ddl

    或者在后半夜开启只读模式
    rekulas
        2
    rekulas  
       20 小时 50 分钟前
    没冲突,但是要看看 ddl 的状态呢,有没可能是因为在等待中, 比如这种情况有程序事务未释放,你在进程可能看不到执行语句但后面的语句就是阻塞了
    june4
        3
    june4  
       19 小时 30 分钟前
    为何要多此一举二边加 date 函数呢?还会导致索引不能用了。
    seers
        4
    seers  
       19 小时 16 分钟前 via Android
    肯定有锁了,看看是不是在 lock wait
    yc8332
        5
    yc8332  
       8 小时 7 分钟前
    搞不懂为啥要用 date 函数。。。。正常不都记录时间戳吗
    spritecn
        6
    spritecn  
       7 小时 35 分钟前
    @yc8332 列表选时间,不都是按天的?
    chengquan17
        7
    chengquan17  
       6 小时 41 分钟前
    30w 能算大表了?整表也就几十 MB ,建索引正常都是秒级吧
    RangerWolf
        8
    RangerWolf  
       3 小时 59 分钟前
    如果 create_time 的数据不是非常集中的情况下 :

    1. create_time 加索引
    2. 改 SQL , 不能使用 date(create_time)的方式,索引会失效, 改成 create_time between 的方式

    30W 的数据 应该不多,加了索引应该生效挺快的

    类似的 uid 也可以尝试加索引
    hhhhhh123
        9
    hhhhhh123  
    OP
       2 小时 46 分钟前
    @RangerWolf #8 所以我最近在改代码,理论上这数据确实不多,加索引应该很快,但是确实执行了很久都没有成功!
    hhhhhh123
        10
    hhhhhh123  
    OP
       2 小时 45 分钟前
    我知道 date 索引会失效 呀
    asmile1993
        11
    asmile1993  
       51 分钟前
    1 、8.0 有函数索引了
    yc8332
        12
    yc8332  
       34 分钟前
    @spritecn 直接用时间戳就能解决了啊。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5477 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 08:51 · PVG 16:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.