Jor*_*Day 2 mysql performance limits paging
如果我有一张桌子User
,做这样的事情会更快:
SELECT * FROM user WHERE id > ? ORDER BY id LIMIT 10000
(每个后续查询都使用前最后一行的 id 作为参数)
或者使用带有偏移量的 LIMIT,如下所示:
SELECT * FROM user ORDER BY id LIMIT ?, 10000
(到目前为止检索到的记录总数是偏移量)。
作为一个额外的复杂因素,如果我想基于链接表连接执行类似的查询怎么办?就像说一个user
可以属于多个角色,所以我想要一个查询
SELECT u.*
FROM user u
INNER JOIN user_roles ur ON ur.user_id = u.id
WHERE ur.role_name IN ('Admin', 'SuperUser', 'etc.')
LIMIT ?, 10000
连接是否会影响关于首选哪种样式查询的决定?
OFFSET
是非常糟糕的。不是在 Order(N) 时间内处理数据,而是需要 Order(N*N)。这是因为努力跳过“偏移”行。
而是“记住你离开的地方”。我在这两个博客中详细介绍了此类内容:
通过 OFFSET 进行分页是不好的:http : //mysql.rjweb.org/doc.php/pagination(它提供了“left off”的详细信息作为一个不错的选择)
如何通过分块删除大量行:http : //mysql.rjweb.org/doc.php/deletebig。你需要让它适应DELETE
你正在做的事情。它还提供了有关如何遍历PRIMARY KEY
以有效发现下一个“块”的提示。
这些技巧适用于所有版本的 MySQL。
归档时间: |
|
查看次数: |
3439 次 |
最近记录: |