MySQL 取余%运算如何优化?

白菜1031
  • 5.4k
SELECT user_id, id
FROM user_detail
WHERE id % 10 = 3
ORDER BY updated_at ASC
LIMIT 10

id 取余运算,在运算符前面,无法使用索引,请问有什么好的优化办法?

回复
阅读 4.6k
2 个回答
一枚小白
  • 244
✓ 已被采纳

这种运算无法走索引,数据量小还可以,如果数据量大了是否可以这样做:

第一步:查询出所有id

select id from user_detail

第二步:使用代码在内存计算出id % 10 = 3的满足条件的id集合

List<Integer> ids = allIds.stream().filter(id -> id % 10 == 3).collect(Collectors.toList());

第三步:使用in进行查询(如果上一步ids量太大,也可以考虑分批查询)。

SELECT user_id, id
FROM user_detail
WHERE id in (${此处应该使用foreach})
ORDER BY updated_at
ASC LIMIT 10

虽然访问了2次数据库,但是这样两步都会走id索引,应该会比之前更快。

运算无法走索引的,除非你把取余后的数存到字段里,建一个索引

宣传栏