我正在做一个社会应用程序,需要分页的职位。
这是数据库:
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?
3条答案
按热度按时间fkaflof61#
根据mysql网站,未签名的bigint可以达到18446744073709551615。如果您全天候每秒插入100万条记录,则需要584542年才能达到该限制。所以我觉得你不应该太担心。
举个例子:
请注意,20代表要显示的位数,与存储无关。
ddrv8njm2#
为什么不添加另一列?
因此,在添加文章之前,先搜索最后一个(最大的)真实的\u id,然后递增它。
5q4ezhmt3#
你的设计有问题。
您的id不是真实的id。id应该是主键并自动递增。不应该有重复使用身份证的情况。这很混乱。
您的id数据类型int不足以支持实际数据。按照其他开发人员的建议,将其更改为bigint。
mysql在内部将日期时间或时间戳存储为整数。尺寸影响很小。但是您应该只使用id(orderbyiddesc,而不是time),并确保它是主键。这将使您的查询非常快速,因为它直接处理聚集索引