使用phpmyadmin的GUI与使用alter table更改字段类型会产生不同的行为

时间:2019-12-08 18:11:16

标签: mysql database indexing phpmyadmin

我的数据库有两个表:付款和预订。

付款表有五百万行,我有一个简单的查询:

right

select * from payments where payments.booking_id in(64791, 64792,...,65791)运营商内部,有1000个预订ID。

这是mysql in的输出。这表明我的表支付索引未使用,而mysql对支付表进行了全面扫描。执行大约需要800〜900毫秒。(很多)

Output of explain

经过一些搜索,我发现bookings.id字段为explain,而payments.booking_id为unsigned int(10)。因此,mysql必须对signed int(11)进行1000次强制转换才能使用我的索引。

通过更改phpmyadmin的GUI中的payments.booking_id字段类型,如下所示解决了我的问题。

Changing payments.booking_id from phpmyadmin's graphical user interface

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

explain output after booking_id change using phpmyadmin's GUI

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

unsigned int(10)

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

我尝试了

  1. 删除并重新创建索引
  2. 通过ALTER TABLE payments CHANGE booking_id booking_id INT(10) UNSIGNED NULL DEFAULT NULL;重置查询缓存
  3. 重新启动mysql服务器

没有成功

我正在使用:

  • phpmyadmin:4.9.0.1
  • mysql服务器:10.3.16-MariaDB

1 个答案:

答案 0 :(得分:0)

我认为您在NULLNOT NULL中存在不一致之处。