SELECT * FROM products <<
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<
首先在 prodid
上创建一个索引,参考 @Anthony 的答案。
然后修改查询语句为:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
如果您确保您的
IN
列表在提供给
IN
子句之前按升序排序,则
order by prodid
将产生与
order by field(...
相同的结果。
以下是一些技巧:
- 使用函数而不是字段会导致无法使用索引,从而导致缓慢。
-
select *
将获取您可能不需要的数据,导致额外的磁盘访问、额外的内存使用和额外的网络流量。
- 在InnoDB上,如果您只选择索引字段,MySQL永远不会读取表,而只会读取索引,从而节省时间(在您的情况下可能不是问题)。
对于最佳方法,有几个技巧可供使用:
- 如果产品表不太大,则可以将其设置为存储在RAM中的
memory
表。请勿针对大型表执行此操作,否则会降低其他事务的速度。您只能在内存表上使用
hash
索引。
- 如果prodid连续,则可以使用
BETWEEN 1000 AND 1019
而不是
IN (1000, 1001 ..., 1019)
。