2017-02-28 74 views
0

例如,我有一个名为varchar(10)的单个Name列的“NAMES”表;这个表有500行。我还有一个“NAME_COLLECTIONS”表,其中一列为longtext;在表的单行中,该列包含长度为5500的字符串。什么是更快的 - 从n列中取出一列大小为t的单列,或者从1列中取出列大小为n * t的列?

SELECT * FROM NAMES WHERE :Name = 'Tom';运行得比SELECT * FROM NAME_COLLECTIONS;慢吗?

如何增加NAMES中的列数与增加NAME_COLLECTIONS中单个文本的大小会影响性能?

+0

我倾向于猜测其他所有条件都相同,将数据分割成更多的行会在整个表扫描中为DBMS创建更多的开销,但很少其他条件相等。无论如何,这是一个很空洞的问题 - 很难想象一个有用的应用程序,其中提出的数据表示同样适用于语义*。 –

回答

0
SELECT * FROM NAMES WHERE Name = 'Tom'; 

这应该是更快,假设你有一个列的索引(你应该,因为你似乎试图获得最佳性能)。它只需要从索引读取一行,并且该行将占用一页数据。

longtext可能会跨越多页数据,并且每读取一个名称列表将被迫读取整个集合。

如果你想搜索一个特定的名字,我建议你正确地为你的数据建模,每行一行。并为该列创建一个索引。

尽管500行对MySQL来说并不重要。它可能适合内存中缓冲池中的几个页面,所以不应该专注于性能,直到获得更大的数据集。

顺便说一句,您的语法WHERE :Name = 'Tom'是不正确的。带有冒号前缀的列名似乎是一个命名参数占位符,而不是列名。参数占位符只能是固定的字符串,而不能是列的名称。

+0

对不起,我的意思是写Name =:Name;这很晚了,我很累。无论如何感谢您的答案! –

相关问题