select * from table where status=1 and p_id in (1,2,3,4,5)
mysql 会将 in 列表中的筛选条件与 其他条件进行排列组合,转化成等值筛选,如
- select * from table where status=1 and p_id = 1
- select * from table where status=1 and p_id = 2
- … (笛卡尔积)
然后将这些查询的结果合并,得到最终的结果。
有时候 用了范围查询,则索引会失效(或者 不使用复合索引后面的几列),可能mysql 会在**“排列组合条件 进行多次查询 再合并结果”** 与 “放弃索引而扫描更多行” 这2种策略间 进行性能权衡,选择mysql认为开销低的方式。如果坚持用索引,可以用force index 强制使用索引进行查询。