我的数据库有两个表:付款和预订。
付款表有五百万行,我有一个简单的查询:
right
在select * from payments where payments.booking_id in(64791, 64792,...,65791)
运营商内部,有1000个预订ID。
这是mysql in
的输出。这表明我的表支付索引未使用,而mysql对支付表进行了全面扫描。执行大约需要800〜900毫秒。(很多)
经过一些搜索,我发现bookings.id字段为explain
,而payments.booking_id为unsigned int(10)
。因此,mysql必须对signed int(11)
进行1000次强制转换才能使用我的索引。
通过更改phpmyadmin的GUI中的payments.booking_id字段类型,如下所示解决了我的问题。
现在我的查询使用我的索引并在33ms内执行
我的问题是,当我使用mysql的alter table执行相同的更改时:
unsigned int(10)
原始查询一直不使用我的索引。
我尝试了
ALTER TABLE payments CHANGE booking_id booking_id INT(10) UNSIGNED NULL DEFAULT NULL;
重置查询缓存没有成功
我正在使用:
答案 0 :(得分:0)
我认为您在NULL
与NOT NULL
中存在不一致之处。