【问题标题】:MySQL performance tuningMySQL 性能调优
【发布时间】:2014-05-14 14:56:21
【问题描述】:

这里是新手。更多的设计问题。所以在处理Mysql数据库中的大型数据集时,我必须选择以下存储方法之一以获得更好的性能(我倾向于多次检查记录的类型)

1) 两列 - 一列用于记录的类型 (varchar(11)) 和值 (int (11))

   eg: type="one", value= 12

2) 合并列并在值之前添加类型

   eg: value="one_12"

哪种方法看起来更可行?谢谢你的帮助。

【问题讨论】:

  • 第二种方法违反了atomicity的原则,因此违反了1NF。

标签: mysql database-design


【解决方案1】:

显然,第一个变体。第二个扼杀了数据结构化和关系数据库的想法。 从阅读数据库normalization开始。

【讨论】:

    【解决方案2】:

    方法 1 更好,因为您需要多次查询记录类型。 方法2的性能问题,因为每次您需要执行字符串操作以从数据中提取记录类型然后匹配

    【讨论】:

      【解决方案3】:

      我会推荐方法一。大概您会将类型存储在事实表中并将其连接到您的原始数据。如果是这样,则代表较大的表将需要更少的存储空间来存储一个小的整数值,并且(假设您在 (value, type) 上创建索引)加入事实表将非常有效和快速。

      换句话说,我会推荐如下内容

      数据表: id, data, more data, type_value

      类型表: type_value, 类型

      使用 (type, type_value) 上的复合(又名复杂,又名多列)索引来索引类型表。然后您的连接可以利用覆盖索引,例如,

      SELECT a.*
      FROM data AS A
      INNER JOIN type AS b
      ON a.type_value = b.type_value 
      WHERE b.type = ?
      

      请注意,顺序在 MySQL 中的复合索引中很重要。因此,如果目标确实是评估WHERE b.type = "One"(例如),您将希望索引 (type, type_value),而不是相反。这将让您过滤您的类型表并应用索引中的 id 值,而无需诉诸索引合并。

      【讨论】:

        【解决方案4】:

        方法 1 优于方法 2。但是,如果您定义了类型列表,这是我的建议。

        为类型(int type_id、varchar 类型)创建一个新表并索引类型varchar 列。在您的实际表中使用外键引用。当您的表格变大时,这将是一种理想的处理方式。

        【讨论】:

          猜你喜欢
          • 2018-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          相关资源
          最近更新 更多