Mysql 在sql中,哪一种方法可以将性能问题降到最低
从客户端机器上,我必须每30秒获得600*10条记录,并将其存储在DB中。我有大约600个ID,每个ID有10个参数,因此总计为6000个。因此,我正在考虑一个表结构,它将具有最低的性能问题 第一个想法 列名将是范围从1到600的ID,行将是参数,如下所示Mysql 在sql中,哪一种方法可以将性能问题降到最低,mysql,sql-server,database,database-design,Mysql,Sql Server,Database,Database Design,从客户端机器上,我必须每30秒获得600*10条记录,并将其存储在DB中。我有大约600个ID,每个ID有10个参数,因此总计为6000个。因此,我正在考虑一个表结构,它将具有最低的性能问题 第一个想法 列名将是范围从1到600的ID,行将是参数,如下所示 1 2 3 4 5 6 7 8 9 9..............598 598 599 600 a b c d e f g h i o..............d d f h g m m k s l l j j k.....
1 2 3 4 5 6 7 8 9 9..............598 598 599 600
a b c d e f g h i o..............d d f h
g m m k s l l j j k..............u j j j
.
.
. 10 parameters
.
.
a d g h j k l l l y..............k l l l
a b c d e f g h i o..............d d f h
g m m k s l l j j k..............u j j j
.
.
. 10 parameters
.
.
a d g h j k l l l y..............k l l l
a b c d e f g h i o..............d d f h
g m m k s l l j j k..............u j j j
.
.
. 10 parameters
.
.
a d g h j k l l l y..............k l l l
因此,每隔30秒,我将插入DB作为新行(相应的参数)
第二个想法
我将为相应的参数制作10个不同的表,为ID制作一个表,ID是主键,外键链接到其他10个表(参数表)
如果你有任何其他想法,那么也非常欢迎
我现在使用ms sql server,但数据库不重要(我也可以使用其他数据库)我相信您需要临时表概念。您应该做的是检索所有外部数据源,并将它们完全从原始数据源加载到临时表中。之后,将该数据加载到事务结构中。在这个概念中,您总是区分
staging
和transactional
数据结构。顺便说一句,这通常是更大的ETL概念(提取/转换/加载)的一部分
我将描述做舞台表演的一种“味道”:
- 以原始形式分析数据 它可以是CSV、Excel、分隔或格式化文件、另一个数据库或其他任何形式。您必须枚举有限数量的源和结构,以便与登台相关。稍后再引入其他源代码是可以的,但首先,可以说,只关注其中的几个。写下每个表/字段的名称-从一开始就把事情弄清楚。写下/记录每个表/字段的格式-这将便于您编写代码,并在以后的生产中查找数据错误-例如,内容过长的文本字段
- 创建临时表结构 您可以在事务数据所在的单独数据库、单独模式或甚至相同的数据库/模式中执行此操作。数据库/模式分离主要是由于管理目的而引入的,如限制数据库增长、用户分析输入数据的权限等。它对于“关注点分离”也很有价值。因此,在上一步中写下您的结构,并用它们创建表。我喜欢在每个数据源中添加另一个identity(sequence)列,以便在出于某种原因必须操作行数据时轻松识别原始数据的加载行
- 引入其他表/列
这些是计算列、批次号标识表、批次号列等。您认为需要添加到暂存表中的每一项开销都可以用于暂存流程。例如,当您在一天中多次导入数据,并且执行从暂存到事务数据的数据加载的流程每天运行一次。然后,在开始每次数据导入之前,在
表中创建批号,并在添加到每个暂存表的其他batch
列中使用该编号。然后,数据加载过程将逐批加载数据BatchNumber
- 添加约束条件 只有当你知道自己在做什么时,你才应该采取这一步。对临时表设置约束的一个原因是,您根本不希望看到不一致的源数据。通常,这是不需要的,您希望导入所有外部数据以进行转移
- 创建数据转换/加载过程 这里我不指SQL Server存储过程,而是指暂存数据所需的逻辑过程。原始存储过程、SSIS包、外部进程、SQLCLR程序集等的实现可能有所不同。底线是您必须将数据从暂存表中的格式A转换为事务表中的格式B。通常我在一个临时表上编写SQL查询并填充事务表。您必须涵盖转换失败的情况:如果原始数据中的datetime根本不是datetime怎么办?如果不需要空数据,应该用NULL替换它吗?父子行(例如孤立行)之间的数据不一致性如何?顺便说一句,这个步骤是ETL过程的一部分 最后,应该将这些数据插入事务结构(ETL加载部分) 当您实现这一点时,您需要进行一次测试——获取一些数据源并尝试在转换过程中运行它。如果其中至少有一个失败,这是很好的,因为您发现了一些意想不到的东西,并且没有尝试用这些东西填充生产表;)
HTH一般来说,我建议设计数据库以尽可能接近问题域,并且只在可以证明存在问题时才考虑性能 从你的问题来看,我无法掌握底层数据——每30秒10条记录,600列似乎是最好的描述。因此,从创建一个表开始,该表对这一点进行了建模——基本上是“选项1” 创建一个测试环境,并将其装满数据,这样您就可以重新创建生产规模的性能问题。10条记录*120/小时*24小时=29K/天;推出价值6个月左右的工具(谷歌DBMonster