我有表包含text和blob字段以及其他一些,我想知道使用这些数据类型是否会减慢对表的访问
CREATE TABLE post
(
id INT(11),
person_id INT(11) ,
title VARCHAR(120) ,
date DATETIME ,
content TEXT,
image BLOB ,
);
让我说我有超过100,000个帖子,我想做一些像
这样的查询SELECT * FROM post WHERE post.date >= ? AND post.person_id = ?
如果表不包含TEXT和BLOB字段
,查询会更快答案 0 :(得分:5)
是或否。
如果您不提取text / blob字段,它们不会减慢SELECTs
的速度。如果你这样做,那么他们会以这两种方式中的任何一种或两种方式减慢速度:
TEXT
和BLOB
数据(如果足够大)存储在与其余列不同的区域中。此可能需要额外的磁盘命中。 (或者,如果已经缓存,则可能不会。)GROUP BY
,ORDER BY
和子查询。如果您要提取文本或blob,则临时表不能是MEMORY
,但必须是较慢的MyISAM
。INDEX(person_id, date)
。如果没有它,查询可能会选择收集text / blob(隐藏在*
中)并将其拖放,然后将其丢弃。行动事项:
content
,请不要使用*
。如果您需要TEXT
或BLOB
,请使用它;替代品往往不会更好。在InnoDB的情况下,使用“垂直分区”(“分割表”,如@changepicture所述)并不是更好。 (这对MyISAM来说是一个有用的技巧。)InnoDB实际上是“为你做分裂”。
答案 1 :(得分:0)
在我看来,简短的回答是肯定的。但当然还有更多。
如果你有好的索引,那么mysql会非常快地定位数据,但由于数据很大,所以发送数据需要更长的时间。
通常,较小的表和数字列类型的使用可提供更好的性能。
从来没有" SELECT *",这只是不好的做法,在你的情况下,它是最糟糕的。如果您只需要标题和日期怎么办?而不是转移少量数据,而是将其全部转移。
考虑将表格,元数据分成一个表格,将内容和图像分割到另一个表格中。这种方式通过第一个表非常快,只有当您需要第二个表中的数据时才能访问它。您将使用此表结构建立一对一的关系。