我怀疑缓慢的原因在于获取行、返回的行数,而不是语句中的 5000 多个绑定占位符。pId IN ( ? , ? , ... , ? )
我的建议是测试仅返回一行,提供一个已知存在/返回一行的值,然后提供 4999+ 已知不存在/不返回一行的值。
例如,如果我们知道表中的最高 pId 值,请使用高于该值的值,为这样的语句提供绑定值
... pId IN ( ? , ? , ? , ... , ? )
所以结果相当于运行
... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )
这与我们运行的结果相同
... pId IN ( 42 )
我们的期望是只返回一行 ( pId = 42 )。
然后将其时间(5000+ 绑定值返回 1 行)与两个绑定值返回单行进行比较
... pId IN ( 99999999 , 42 )
并看看性能是否有显着差异。
(对于 5000 多个绑定值还有更多工作要做,但我不希望huge差异,但应该进行测试。
想一想,使用所有现有的绑定值设置测试可能会更容易,只需添加LIMIT 2
到查询的末尾。 (我不确定MySQL是否有一些性能增强LIMIT 2
.
最好添加一个条件,例如AND pId * 10 = 420
目标是提供一整套绑定值,但只返回一两行。
另一个测试是返回大量行,但仅使用几个绑定值。可能是返回 5000 多行的范围条件。
查询可以是:
... pId >= ? AND pId <= ?
我们在 5000 行附近得到的提供值之间有足够大的范围。
并比较性能。
我的预测(猜测?)是性能将更多地与返回的行数相关,而不是与绑定值的数量相关。
我不确定这是否是您问题的答案,但这是我回答问题的方法......“是什么导致速度变慢,绑定值的数量或返回的行数? ”