我的数据库有两个表:支付和预订。
payments表有50万行,我有一个简单的查询:
select * from payments where payments.booking_id in(64791, 64792,...,65791)
在in操作符内有1000个预订ids。
下面是mysql的explain的输出。这表明我的表支付索引并没有被使用,而mysql对支付进行了全面扫描,table.It大约需要800~900 my才能执行。

经过一些搜索,我发现bookings.id字段是unsigned int(10),而payments.booking_id是signed int(11)。因此,mysql必须对unsigned int(10)进行1000次强制转换才能使用我的索引。
通过从phpmyadmin的GUI中更改payments.booking_id字段类型,如下面所示,解决了我的问题。

现在,我的查询使用我的索引,并在33 my中执行。

我的问题是,当我使用mysql的alter执行相同的更改时:
ALTER TABLE payments CHANGE booking_id booking_id INT(10) UNSIGNED NULL DEFAULT NULL;
原始查询始终不使用我的索引。
我试过了
index
RESET QUERY CACHE;
的查询缓存
百无所成
我正在使用:
4.9.0.1
发布于 2019-12-20 07:15:37
我认为您在NULL与NOT NULL之间存在不一致之处。
https://stackoverflow.com/questions/59238429
复制相似问题