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

1 天前
 hhhhhh123

下面是说明和当时场景
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 秒就执行完了。
我想知道为啥?
目前一直没有找到问题所在, 我已经尝试了两个表,拷贝的表单都是几秒钟就创建完成了! 唯独开发环境的表没有执行成功。
目前唯一能想到的办法就是在夜深人静的时候,进行停止服务,再执行创建索引操作,也不知道行不行。

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

945 次点击
所在节点    MySQL
12 条回复
bobobobob
1 天前
有在线 DDL 的库的,允许数据库一边提供服务,一边在线 ddl

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

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

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

类似的 uid 也可以尝试加索引
hhhhhh123
11 小时 29 分钟前
@RangerWolf #8 所以我最近在改代码,理论上这数据确实不多,加索引应该很快,但是确实执行了很久都没有成功!
hhhhhh123
11 小时 28 分钟前
我知道 date 索引会失效 呀
asmile1993
9 小时 33 分钟前
1 、8.0 有函数索引了
yc8332
9 小时 17 分钟前
@spritecn 直接用时间戳就能解决了啊。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1103619

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX