MySQL 任意索引查询性能



假设您有一个包含以下字段的库存日记帐表:

IDProductIDWarehouseID

ID= PK

ProductID&WarehouseID都是 FK 和索引。

然后,假设我们将 500 万行数据填充到表中。我运行了 2 个查询。 第一个查询同时使用了 FKProductIDWarehouseID

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用于其他目的?

最新更新