我的表包含文本和 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 字段,查询会更快吗
最佳答案
是或否。
如果您不获取文本/blob 字段,它们不会减慢 SELECTs
。如果您这样做,那么他们会通过以下一种或两种方式减慢速度:
- 在 InnoDB 中,
TEXT
和BLOB
数据如果足够大,将存储在与其余列不同的区域中。这可能需要额外的磁盘命中。 (或者可能不会,如果它已经被缓存。) - 在复杂的查询中(比你的更复杂),优化器可能需要创建一个临时表。典型情况:
GROUP BY
、ORDER BY
和子查询。如果您正在获取文本或 blob,临时表不能是MEMORY
,但必须是较慢的MyISAM
。 - 但是,真正的减速是您可能没有这个复合索引:
INDEX(person_id, date)
。没有它,查询可能会选择收集文本/blob(埋在*
中)并将其拖来拖去,只是稍后丢弃它。
行动项目:
- 确保您拥有该复合索引。
- 如果此 查询不需要
内容
,请不要使用*
。
如果您需要TEXT
或BLOB
,请使用它;替代方案往往不会更好。在 InnoDB 的情况下,使用“垂直分区”(“拆分表”,如 @changepicture 所述)并不好。 (这是 MyISAM 的一个有用技巧。)InnoDB 正在有效地“为您进行拆分”。
关于mysql - 文本或 blob 字段是否会减慢对表的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41788933/