mysql分页-按id还是按时间?

63lcw9qa  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(314)

我正在做一个社会应用程序,需要分页的职位。
这是数据库:

id       | post          | time     | 
---------|---------------|----------|
1        | "oldest"      |  9:00    |
2        | "old"         | 10:00    |
3        | "new"         | 11:00    |
4        | "newest"      | 12:00    |

在我的应用程序中:
最新的职位是在顶部,我只载入2个职位的时间。
假设前2个数据被加载到应用程序中
最晚4点(12:00)
3(11:00)新
用户向下滚动时,应用程序检测到已到达最后一篇文章,因此它请求php文件按以下顺序再下载2篇:
2(10:00)岁
1(9:00)以上
很好用。以下是我的代码:

$qry = $db->prepare('SELECT id, post
  FROM posts
  WHERE id < :lastLoadedId
  ORDER BY time DESC LIMIT 0, 2');

问题/问题:
我的服务器自动删除非常旧的帖子(为了节省空间)
假设过了一段时间mysql表达到了它的限制(最后可用的id是2147483647)
然后我需要从1:
问题来了。

id            | post          | time     | 
--------------|---------------|----------|
1             | "new"         | 11:00    |
2             | "newest"      | 12:00    |
2,147,483,646 | "oldest"      | 9:00     |
2,147,483,647 | "old"         | 10:00    |

前2个数据将再次加载到我的应用程序中。
最晚2点(12:00)
1(11:00)新
当它尝试加载更多内容时,它会搜索小于数字2的ID,但由于2147483647更大,因此不会返回“最旧”和“旧”的帖子。
我应该担心这个吗?
大公司如何处理这么多数据?过了一段时间,他们开始新table?

fkaflof6

fkaflof61#

根据mysql网站,未签名的bigint可以达到18446744073709551615。如果您全天候每秒插入100万条记录,则需要584542年才能达到该限制。所以我觉得你不应该太担心。
举个例子:

CREATE TABLE foo (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
)

请注意,20代表要显示的位数,与存储无关。

ddrv8njm

ddrv8njm2#

为什么不添加另一列?

ALTER TABLE `files` ADD `real_id` BIGINT NOT NULL AFTER `id`;

因此,在添加文章之前,先搜索最后一个(最大的)真实的\u id,然后递增它。

5q4ezhmt

5q4ezhmt3#

你的设计有问题。
您的id不是真实的id。id应该是主键并自动递增。不应该有重复使用身份证的情况。这很混乱。
您的id数据类型int不足以支持实际数据。按照其他开发人员的建议,将其更改为bigint。
mysql在内部将日期时间或时间戳存储为整数。尺寸影响很小。但是您应该只使用id(orderbyiddesc,而不是time),并确保它是主键。这将使您的查询非常快速,因为它直接处理聚集索引

相关问题