aet*_*eus 3 mysql sql postgresql
说有一张桌子.该表用于跟踪书的章节.该表具有以下结构:
CREATE TABLE Chapters(
id INT PRIMARY KEY NOT NULL,
storyId INT references Books(id)
title TEXT NOT NULL,
body TEXT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
现在,在此表中,body列将包含一个大的,正文的正文.想象一下平均章节在平均小说中有多大,你会得到一个粗略的想法.它可以容纳数百千字节(甚至一兆字节)的字符串数据.
现在,当然有一些情况你不需要章节的"正文",但需要其他东西,如标题.例如,如果我试图建立一本书中章节的"书籍索引",我会执行如下查询:
SELECT title FROM Chapters WHERE storyId = 1
Run Code Online (Sandbox Code Playgroud)
当然,查询会给我回复故事章节的标题.但是,查询是否会使用大量内存,因为它必须将生成的行(列和所有行)加载到内存中,并且表中的每一行都有一个"重"列("正文"列)?
我问这个是因为(根据我的理解 - 如果我错了,请纠正我)这就是它在文档存储数据库中的工作方式.MongoDB中的每一行(或"文档")必须首先加载到内存中,即使您只想从中返回单个字段.因此,如果我在MongoDB中执行类似的查询,它会通过将大的"body"字段加载到内存中来"浪费"内存,即使我想要返回的唯一字段是"title"字段.
对于大多数SQL实现,这些问题是否相同?我特别要求PostgreSQL,但我也有兴趣知道MySQL是否有不同的方式.
如果您没有选择该列,则不应占用资源.根据您使用的特定SQL类型的工作方式,额外的空间可能会导致更大的页面,因此服务器必须遍历更大的磁盘空间才能找到您需要的行,但在您的示例中'通过ID(可能是索引)进行选择,所以即使这样也不会发生.即使在确实发生这种情况的情况下,额外的列也不会被放入内存中,而是在服务器搜索您需要的行时跳过它.
对于SQL的某些变体,类似a的东西TEXT甚至没有与数据行的其余部分一起存储 - 使用指针指向磁盘上实际保存的位置.在这些情况下,您甚至不会遇到更大的页面问题.
当然,所有这些都将特定于您正在使用的SQL变体的内部.我不是MySQL或PostgreSQL的专家,所以如果我的任何解释不适用于那些特定的SQL实现,那么任何人都可以纠正我.