假设您有一个包含以下字段的库存日记帐表:
ID
、ProductID
、WarehouseID
等
ID
= PK
ProductID
&WarehouseID
都是 FK 和索引。
然后,假设我们将 500 万行数据填充到表中。我运行了 2 个查询。 第一个查询同时使用了 FKProductID
和WarehouseID
SELECT inventoryjournals.id,inventoryjournals.ProductID
FROM zenlite.inventoryjournals
where productid = 1 && WarehouseID = 1
limit 30 offset 2500000
这需要 5.75 秒才能返回结果,这是可以理解的,因为它从第 1 条记录到 2.5 英里记录。但后来我运行了另一个具有任意 ID 约束的查询
SELECT inventoryjournals.id,inventoryjournals.ProductID
FROM zenlite.inventoryjournals
where productid = 1 && WarehouseID = 1 && id <10000000
limit 30 offset 2500000
甚至这个
SELECT inventoryjournals.id,inventoryjournals.ProductID
FROM zenlite.inventoryjournals
where productid = 1 && WarehouseID = 1 && id > 0
limit 30 offset 2500000
这把时间缩短到1.5~1.6秒?!这是否意味着在所有读取查询中添加 PK 约束总是更好?像 id> 0(始终为真(
我的问题是,这样做会带来任何风险吗?
没有办法让offset 2500000
跑得快。 它必须跳过那么多行(除非它到达表的末尾(。
您的所有 3 个查询都可以从中受益
INDEX(production, WarehouseID, id)
大偏移量是进行"分页"的糟糕方法。 最好"记住你离开的地方"。 还是您将大OFFSET
用于其他目的?