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

Ali*_*Ali 1 mysql indexing database-design query-optimization

我有表包含文本和blob字段和其他一些,我想知道如果使用这些类型的数据会减慢对表的访问速度

CREATE TABLE post 
(
    id INT(11),
    person_id INT(11) ,
    title VARCHAR(120) ,
    date DATETIME , 
    content TEXT,
    image BLOB ,
);
Run Code Online (Sandbox Code Playgroud)

假设我有超过100,000个帖子,我想做一些查询

SELECT * FROM post WHERE post.date >= ? AND post.person_id = ?
Run Code Online (Sandbox Code Playgroud)

如果表不包含TEXT和BLOB字段,查询会更快

Ric*_*mes 6

是还是不是.

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

  • 在InnoDB中,TEXTBLOB数据,如果足够大,被存储在从柱的其余部分的单独的区域.这可能需要额外的磁盘命中.(或者,如果已经缓存,则可能不会.)
  • 在复杂查询(比您的查询更复杂)中,优化程序可能需要创建临时表.典型的情况: GROUP BY,ORDER BY和子查询.如果要获取文本或blob,则临时表不能MEMORY,但必须更慢MyISAM.
  • 但是,真正的减速,是你可能没有这个综合指数: INDEX(person_id, date).如果没有它,查询可能会选择收集text/blob(埋在其中*)并将其拖运,只是稍后丢弃它.

行动项目:

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

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