【发布时间】:2020-02-25 04:42:59
【问题描述】:
我有一个包含大约 600 000 个列表的数据库,在带有分页的页面上浏览这些列表时,我使用此查询来限制记录:
SELECT file_id, file_category FROM files ORDER BY file_edit_date DESC LIMIT 290580, 30
在第一页 LIMIT 0, 30 上,它会在几毫秒内加载,LIMIT 30,30、LIMIT 60,30、LIMIT 90,30 等也是如此。但是当我前进到页面末尾时,查询大约需要 1 秒执行。
索引可能不相关,如果我运行它也会发生:
SELECT * FROM `files` LIMIT 400000,30
不知道为什么。 有什么办法可以改善吗?
除非有更好的解决方案,否则只加载所有记录并在 PHP 页面中循环它们以查看记录是否在分页范围内并打印它是一种不好的做法吗?
服务器是具有 16GB 内存的 i7; MySQL 社区服务器 5.7.28; 文件表大约 200 MB
如果重要的话,这里是 my.cnf
query_cache_type = 1
query_cache_size = 1G
sort_buffer_size = 1G
thread_cache_size = 256
table_open_cache = 2500
query_cache_limit = 256M
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 8M
tmp_table_size=2G
max_heap_table_size=2G
【问题讨论】:
-
看起来像我。它需要遍历所有记录才能达到给定的限制,我没想到会这么痛苦。
-
如果您的行有
id UNSIGNED AUTO_INCREMENT, PRIMARY KEY(id)。然后你可以使用WHERE id>? && id<?。 -
我认为当我只需要从某个类别中选择文件时,这是行不通的,如果我理解正确,这仅在没有已删除项目时才有效。我找到了一种更简单的方法,在 urls 中而不是
?page=1、page=2我将简单地使用?date=TIMESTAMP这将允许我直接跳转到右侧file_edit_date限制。 -
我明白你在说
DELETE问题匹配你将从哪里开始。为什么不将您的计数存储在变量中,而不是PRIMARY KEY?
标签: mysql database performance pagination mariadb