Mysql SQL大表优化
我目前正在开发一个相当大的应用程序,它将处理大量数据。 我正在设计数据模型,我想知道如何针对大量数据调整此模型。(我的数据库管理系统是MySQL) 我有一个包含称为“值”的对象的表。共有6列,称为:Mysql SQL大表优化,mysql,sql,database,database-design,relational-database,Mysql,Sql,Database,Database Design,Relational Database,我目前正在开发一个相当大的应用程序,它将处理大量数据。 我正在设计数据模型,我想知道如何针对大量数据调整此模型。(我的数据库管理系统是MySQL) 我有一个包含称为“值”的对象的表。共有6列,称为: 身份证 类型布尔 型浮点数 日期 键入文本 输入 根据该值的类型(在别处写入),其中一列具有数据,其他列为空值 此表旨在包含数百万行(增长非常快)。它也会被阅读很多次 我的设计是用很少的数据做很多线。我想知道是否最好制作5个不同的表,每个表只包含一种类型的数据。有了这个解决方案,将会有更多的连接
- 身份证
- 类型布尔
- 型浮点数
- 日期
- 键入文本
- 输入
- 会有很多争吵
- 读/写操作较多,更新/删除操作较少
- 不会有太多的争吵
- 一开始写的很少,但读的很多
- 将有很多行([nb of Element]x[nb of attribute])
- 有大量的读/写/更新
CREATE TABLE `element` (
`id` int(11),
`group` int(11), ...
CREATE TABLE `attributeDefinition` (
`id` int(11) ,
`name` varchar(100) ,
`typeChamps` varchar(45)
CREATE TABLE `attributeValue` (
`id` int(11) ,
`elementId` int(11) , ===> table element
`attributeDefinitionId` int(11) , ===> table attributeDefinition
`type_bool` tinyint(1) ,
`type_float` decimal(9,8) ,
`type_int` int(11) ,
`type_text` varchar(1000) ,
`type_date` date,
`type_list` int(11) , ===> table listValue
CREATE TABLE `listValue` (
`id` int(11) ,
`name` varchar(100), ...
还有一个SELECT示例,它检索id为66的组的所有元素:
SELECT elementId,
attributeValue.id as idAttribute,
attributeDefinition.name as attributeName,
attributeDefinition.typeChamps as attributeType,
listValue.name as valeurDeListe,
attributeValue.type_bool,
attributeValue.type_int,
DATE_FORMAT(vdc.type_date, '%d/%m/%Y') as type_date,
attributeValue.type_float,
attributeValue.type_text
FROM element
JOIN attributeValue ON attributeValue.elementId = element.id
JOIN attributeDefinition ON attributeValue.attributeDefinitionId = attributeDefinition.id
LEFT JOIN listValue ON attributeValue.type_list = listValue.id
WHERE `e`.`group` = '66'
在我的应用程序中,对于每一行,我打印与属性类型对应的值。由于每次只插入一列,请为每种数据类型创建一个不同的表-如果插入大量数据,这种设计将浪费大量空间 在每个表中减少行数将提高索引查找速度 列名应该描述其中的数据,而不是列类型
请继续阅读。由于每次只在一列中插入数据,请为每种数据类型创建一个不同的表-如果插入大量数据,这种设计将浪费大量空间 在每个表中减少行数将提高索引查找速度 列名应该描述其中的数据,而不是列类型
请继续阅读。每行将有大量空字段。如果表不太大,可以,但正如您所说,将有数百万行,因此您正在浪费空间,并且查询将需要更长的时间来执行。做这样的事: 表1 id |类型 表2
键入|其他字段每行将有大量空字段。如果表不太大,可以,但正如您所说,将有数百万行,因此您正在浪费空间,并且查询将需要更长的时间来执行。做这样的事: 表1 id |类型 表2
键入|其他字段此处不存在写入问题。阅读意愿 你必须问问自己:
- 你多久会问一次
- 是修改旧数据还是只是“附加”
==>如果答案是频繁/仅附加的,或者对旧数据进行了少量修改,缓存可能会解决您的读取问题,因为您不会经常查询库。这里不存在写入问题。阅读意愿 你必须问问自己:
- 你多久会问一次
- 是修改旧数据还是只是“附加”
==>如果答案是频繁/仅附加的,或者对旧数据进行了少量修改,缓存可能会解决您的读取问题,因为您不会经常查询库。我有一些建议,尽管它可能不是您想要的类型:-)
这看起来像一个模式;使用这种模式会导致各种维护/性能噩梦:
- 获取主记录的所有值的复杂查询(基本上,您必须将结果表与其自身连接N次才能获取主记录的N个属性)
- 无引用完整性(我假设您将有单独主数据表的查找值;您不能为此使用外键约束)
- 浪费磁盘空间(因为您的表将被稀疏地填满)
要获得避免这种模式的更完整的原因列表,我建议获得一份我的建议副本,尽管它可能不是您想要的:-)
这看起来像一个模式;使用这种模式会导致各种维护/性能噩梦:
- 获取主记录的所有值的复杂查询(基本上,您必须将结果表与其自身连接N次才能获取主记录的N个属性)
- 无引用完整性(我假设您将有单独主数据表的查找值;您不能为此使用外键约束)
- 浪费磁盘空间(因为您的表将被稀疏地填满)
为了获得避免这种模式的更完整的原因列表,我建议获得一份的副本。最后,我尝试实现这两种解决方案,然后将它们定为基准。 对于这两种解决方案,都有一个表元素和一个表属性定义,如下所示:
| id | group | name | type |
| 12 | 51 | 'The Bool attribute' | type_bool |
| 12 | 51 | 'The Int attribute' | type_int |
| 12 | 51 | 'The first Float attribute' | type_float |
| 12 | 51 | 'The second Float attribute'| type_float |
| id | group | name
| 42 | 51 | 'An element in the group 51'
| id | element | attributeDefinition | type_int | type_bool | type_float | ...
| 1 | 42 | 12 | NULL | TRUE | NULL | NULL...
| 2 | 42 | 13 | 5421 | NULL | NULL | NULL...
| 3 | 42 | 14 | NULL | NULL | 23.5 | NULL...
| 4 | 42 | 15 | NULL | NULL | 56.8 | NULL...
| id | group | element | value |
| 3 | 51 | 42 | 23.5 |
| 4 | 51 | 42 | 56.8 |
| id | group | element | value |
| 1 | 51 | 42 | TRUE |
| id | group | element | value |
| 2 | 51 | 42 | 5421 |