Mysql 在sql中,哪一种方法可以将性能问题降到最低

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.....

从客户端机器上,我必须每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..............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加载部分)

    当您实现这一点时,您需要进行一次测试——获取一些数据源并尝试在转换过程中运行它。如果其中至少有一个失败,这是很好的,因为您发现了一些意想不到的东西,并且没有尝试用这些东西填充生产表;)

我没有介绍为ETL过程创建时间表、数据导入失败的警报和报告、数据清理、执行匹配/合并等。此外,我也没有介绍一些实现细节,比如您是否应该删除(或者更好地截断)您可以在ETL过程之后从暂存表中导入数据,或者让它留在那里,以进行某种导入归档。这可能是一个相当复杂的过程,正确的工作概念/工具可以使其更容易


HTH

一般来说,我建议设计数据库以尽可能接近问题域,并且只在可以证明存在问题时才考虑性能

从你的问题来看,我无法掌握底层数据——每30秒10条记录,600列似乎是最好的描述。因此,从创建一个表开始,该表对这一点进行了建模——基本上是“选项1”

创建一个测试环境,并将其装满数据,这样您就可以重新创建生产规模的性能问题。10条记录*120/小时*24小时=29K/天;推出价值6个月左右的工具(谷歌DBMonster