mysql - 文本或 blob 字段是否会减慢对表的访问

标签 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 ,
);

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

SELECT * FROM post WHERE post.date >= ? AND post.person_id = ?

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

最佳答案

是或否。

如果您不获取文本/blob 字段,它们不会减慢 SELECTs。如果您这样做,那么他们会通过以下一种或两种方式减慢速度:

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

行动项目:

  • 确保您拥有该复合索引。
  • 如果 查询不需要内容,请不要使用*

如果您需要TEXTBLOB,请使用它;替代方案往往不会更好。在 InnoDB 的情况下,使用“垂直分区”(“拆分表”,如 @changepicture 所述)并不好。 (这是 MyISAM 的一个有用技巧。)InnoDB 正在有效地“为您进行拆分”。

关于mysql - 文本或 blob 字段是否会减慢对表的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41788933/

相关文章:

php - 将 php 开关列值设置为 1 或 0

database - 创建太多数据库索引的权衡是什么?

php - 一对一关系/唯一 key 对

SQL 很好地检索树结构

python - 伪增加值表的 'resolution'

php - 如何使用codeigniter上传多张图片

java - 正确更新 dropwizard/jdbi 网络服务中的内存缓存

MySQL 操作数应包含 3 列

ruby-on-rails - 如何在 Ruby on Rails 应用程序中添加照片以更正索引?

c# - 二维数组 C#