【问题标题】: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"
哪种方法看起来更可行?谢谢你的帮助。
【问题讨论】:
标签:
mysql
database-design
【解决方案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 列。在您的实际表中使用外键引用。当您的表格变大时,这将是一种理想的处理方式。