说有一张桌子.该表用于跟踪书的章节.该表具有以下结构:
CREATE TABLE Chapters(
id INT PRIMARY KEY NOT NULL,
storyId INT references Books(id)
title TEXT NOT NULL,
body TEXT NOT NULL
);
现在,在此表中,body列将包含一个大的,正文的正文.想象一下平均章节在平均小说中有多大,你会得到一个粗略的想法.它将保留数百千字节(甚至一兆字节)的字符串数据.
现在,当然有一些情况你不需要章节的“正文”,但需要其他东西,如标题.例如,如果我试图建立一本书中章节的“书籍索引”,我会执行如下查询:
SELECT title FROM Chapters WHERE storyId = 1
当然,查询会给我回复故事章节的标题.但是,查询是否会使用大量内存,因为它必须将生成的行(列和所有行)加载到内存中,并且表中的每一行都有一个“重”列(“正文”列)?
我问这个是因为(根据我的理解 – 如果我错了,请纠正我)这就是它在文档存储数据库中的工作方式. MongoDB中的每一行(或“文档”)必须首先加载到内存中,即使您只想从中返回单个字段.因此,如果我在MongoDB中执行类似的查询,它会通过将大的“body”字段加载到内存中来“浪费”内存,即使我想要返回的唯一字段是“title”字段.
对于大多数sql实现,这些问题是否相同?我特别要求Postgresql,但我也有兴趣知道MysqL是否有不同的方式.
解决方法:
如果您没有选择该列,则不应占用资源.根据您使用的特定sql类型的工作方式,额外的空间可能会导致更大的页面,因此服务器必须遍历更大的磁盘空间才能找到您需要的行,但在您的示例中’通过ID(可能是索引)进行选择,所以即使这样也不会发生.即使在确实发生这种情况的情况下,额外的列也不会被放入内存中,而是在服务器搜索您需要的行时跳过它.
对于sql的某些变体,类似于TEXT的东西甚至不与数据行的其余部分一起存储 – 使用指向磁盘上实际保存的位置的指针.在这些情况下,您甚至不会遇到更大的页面问题.
当然,所有这些都将特定于您正在使用的sql变体的内部.我不是MysqL或Postgresql的专家,所以如果我的任何解释不适用于那些特定的sql实现,那么任何人都可以纠正我.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。