mysql - 使用 phpmyadmin 的 GUI 与使用 alter table 更改字段类型会产生不同的行为
问题描述
我的数据库有两个表:付款和预订。
付款表有半百万行,我有这个简单的查询:
select * from payments where payments.booking_id in(64791, 64792,...,65791)
运营商内部in
有 1000 个预订 ID。
这是mysql的输出explain
。这表明我没有使用表支付的索引,而是 mysql 对支付表进行了全面扫描。执行大约需要 800~900 毫秒。(很多)
经过一番搜索,我发现 bookings.id 字段是unsigned int(10)
而 payment.booking_id 是signed int(11)
。因此 mysql 必须进行 1000 次强制转换unsigned int(10)
才能使用我的索引。
通过从 phpmyadmin 的 GUI 更改 payment.booking_id 字段类型,如下所示可以解决我的问题。
现在我的查询使用我的索引并在 33 毫秒内执行
我的问题是,当我使用 mysql 的 alter table 执行相同的更改时:
ALTER TABLE payments CHANGE booking_id booking_id INT(10) UNSIGNED NULL DEFAULT NULL;
原始查询一直不使用我的索引。
我试过了
- 删除和重新创建索引
- 重置查询缓存
RESET QUERY CACHE;
- 重启mysql服务器
没有任何成功
我在用:
- phpmyadmin:4.9.0.1
- mysql-服务器:10.3.16-MariaDB
解决方案
NULL
我认为你在vs中有不一致的地方NOT NULL
。
推荐阅读
- c# - 在 WPF C# 中为选定用户显示 Active Directory ThumbnailPhoto 属性的正确方法?
- android - MediaPlayer setDataSource 失败,状态=0x80000000
- postgresql - POSTGRES:致命:角色“用户名”不存在
- c# - 错误无法使用 .Net Core 3.1 在 Ubuntu 上加载文件或程序集 Tesseract
- vue.js - 找不到模块'wcjs-player'
- mysql - 连接到 Azure Mysql 服务器
- node.js - 为什么以及如何修复不调用 setTimeout 回调的异步函数?节点JS
- c - 如何在c中从左下角开始坐标?
- javascript - 我可以在递归函数中推送索引吗?
- python - pyspark:具有用户定义函数 (UDF) 的 StopWordsRemover