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

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

举报· 206 次点击
登录 注册 站外分享
1 条回复  
bobobobob 初学 昨天 18:00
有在线 DDL 的库的,允许数据库一边提供服务,一边在线 ddl 或者在后半夜开启只读模式
返回顶部