【问题标题】:Does text or blob fields slow down the access to the table文本或 blob 字段是否会减慢对表的访问速度
【发布时间】:2017-06-06 22:26:06
【问题描述】:

我的表格包含文本和 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 字段,查询会更快吗

【问题讨论】:

  • 与其回复意见,不如自己测试一下?
  • 如何在100,00行中插入图片和文字内容?

标签: mysql indexing database-design query-optimization


【解决方案1】:

是或否。

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

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

行动项目:

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

如果您需要TEXTBLOB,请使用它;替代品往往也好不到哪里去。在 InnoDB 的情况下,使用“垂直分区”(@changepicture 提到的“拆分表”)并没有更好。 (这是 MyISAM 的一个有用技巧。)InnoDB 有效地“为您进行拆分”。

【讨论】:

    【解决方案2】:

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

    如果你有很好的索引,那么mysql会很快找到数据,但是因为数据很大,所以发送数据需要更长的时间。

    一般来说,较小的表和使用数字列类型可以提供更好的性能。

    永远不要做“SELECT *”,这是不好的做法,在你的情况下是最糟糕的。如果您只需要标题和日期怎么办?与其传输少量数据,不如传输所有数据。

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

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多