text或blob字段是否会减慢对表的访问速度

时间:2017-01-22 08:40:27

标签: mysql indexing database-design query-optimization

我有表包含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字段

,查询会更快

2 个答案:

答案 0 :(得分:5)

是或否。

如果您不提取text / blob字段,它们不会减慢SELECTs的速度。如果你这样做,那么他们会以这两种方式中的任何一种或两种方式减慢速度:

  • 在InnoDB中,TEXTBLOB数据(如果足够大)存储在与其余列不同的区域中。此可能需要额外的磁盘命中。 (或者,如果已经缓存,则可能不会。)
  • 在复杂查询中(比您的更复杂),Optimizer可能需要创建一个临时表。典型情况:GROUP BYORDER BY和子查询。如果您要提取文本或blob,则临时表不能是MEMORY,但必须是较慢的MyISAM
  • 但是,真正的减速,是你可能没有这个综合指数:INDEX(person_id, date)。如果没有它,查询可能会选择收集text / blob(隐藏在*中)并将其拖放,然后将其丢弃。

行动事项:

  • 确保您拥有该综合指数。
  • 如果查询不需要content,请不要使用*

如果您需要TEXTBLOB,请使用它;替代品往往不会更好。在InnoDB的情况下,使用“垂直分区”(“分割表”,如@changepicture所述)并不是更好。 (这对MyISAM来说是一个有用的技巧。)InnoDB实际上是“为你做分裂”。

答案 1 :(得分:0)

在我看来,简短的回答是肯定的。但当然还有更多。

如果你有好的索引,那么mysql会非常快地定位数据,但由于数据很大,所以发送数据需要更长的时间。

通常,较小的表和数字列类型的使用可提供更好的性能。

从来没有" SELECT *",这只是不好的做法,在你的情况下,它是最糟糕的。如果您只需要标题和日期怎么办?而不是转移少量数据,而是将其全部转移。

考虑将表格,元数据分成一个表格,将内容和图像分割到另一个表格中。这种方式通过第一个表非常快,只有当您需要第二个表中的数据时才能访问它。您将使用此表结构建立一对一的关系。