首页 > 解决方案 > 使用 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 字段类型,如下所示可以解决我的问题。

从 phpmyadmin 的图形用户界面更改 payment.booking_id

现在我的查询使用我的索引并在 33 毫秒内执行

使用 phpmyadmin 的 GUI 在 booking_id 更改后解释输出

我的问题是,当我使用 mysql 的 alter table 执行相同的更改时:

ALTER TABLE payments CHANGE booking_id booking_id INT(10) UNSIGNED NULL DEFAULT NULL;

原始查询一直不使用我的索引。

我试过了

  1. 删除和重新创建索引
  2. 重置查询缓存RESET QUERY CACHE;
  3. 重启mysql服务器

没有任何成功

我在用:

标签: mysqldatabaseindexingphpmyadmin

解决方案


NULL我认为你在vs中有不一致的地方NOT NULL


推荐阅读