mysql - SQL大表优化

标签 mysql sql database database-design relational-database

我目前正在开发一个相当大的应用程序,它将处理大量数据。 我正在设计数据模型,我想知道如何针对大量数据调整该模型。 (我的数据库管理系统是 MySQL)

我有一个表,其中包含称为“值”的对象。有 6 列称为:

  • 编号
  • bool 型
  • type_float
  • 输入日期
  • type_text
  • type_int

根据该值的类型(写在别处),其中一列有数据,其他列为 NULL 值。

此表旨在包含数百万行(增长非常快)。它也会被阅读很多次。

我的设计将用很少的数据制作很多行。我想知道制作 5 个不同的表是否更好,每个表只包含一种类型的数据。有了这个解决方案,就会有更多的接缝。

你能给我一个建议吗? 非常感谢!

编辑:我的表的描述

表元素 在应用程序中有包含属性的元素。

  • 会有很多行。
  • 读/写多,更新/删除少。

TABLE ATTRIBUTEDEFINITION 每个属性都在表 attributeDefinition 中描述(设计时),说明属性的类型。

  • 不会有很多行
  • 开始时写入很少,但读取很多。

TABLE ATTRIBUTEVALUE 之后,另一个表“attributeValue”包含每个元素的每个 attributeDefinition 的实际数据。

  • 会有很多行([元素数量] x [属性数量])
  • 大量读/写/更新

TABLE LISTVALUE *有些类型很复杂,例如 list_type。此类型可用的值集位于另一个名为 LISTVALUE 的表中。然后属性值表包含一个 id,它是 ListValue 表的键*

这是创建语句

 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'

在我的应用程序中,我为每一行打印对应于属性类型的值。

最佳答案

由于您每次只插入一个列,因此请为每种数据类型创建一个不同的表 - 如果您要插入大量数据,这种设计会浪费大量空间。

每个表中的行数越少,索引查找速度就越快。

您的列名应该描述其中的数据,而不是列类型。

继续阅读 Database Normalisation .

关于mysql - SQL大表优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8745633/

相关文章:

mysql - 将 timediff 结果插入表中

php - Symfony2 Doctrine blob 类型

java - 如何避免将空值发送到java中的sql中

C# - 使用不同的 ODBC 驱动程序连接来自两个不同数据库的表

mysql - 试图用它们之间的枢轴填充两个表

c# - 是否有任何第三方库可以将 Postgresql 或 MySql 与 C# 一起使用,从而允许直接将对象转换为数据库?

c# - 从 IP 摄像机流式传输图像后如何将图像保存到数据库?

sql - 需要有关 SELECT DISTINCT 查询的帮助

Django 临时将其他数据库结果与 ORM 合并

php - 将用户数据存储在 csv 文件与数据库中