mysql - 这是解决sql中最低性能问题的好方法

标签 mysql sql-server database database-design

从客户机上,我每30秒要得到600*10条记录,应该存储在数据库中。我有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秒,我将作为新行(对应的参数)插入数据库。
第二个想法
我将为相应的参数创建10个不同的表,并为ids创建一个表,ids是与其他10个表(参数表)的外键链接的主键。
如果你还有其他想法,那也很欢迎。
我现在使用ms sql server,但db不重要(我也可以使用其他db)

最佳答案

我相信你需要临时桌子的概念。您应该做的是检索所有外部数据源,并将它们完全从原始表加载到临时表中。之后,将此数据加载到事务结构中。在这个概念中,您总是区分stagingtransactional数据结构。顺便说一下,这通常是更大的etl概念(提取/转换/加载)的一部分。
我将描述一种表演的“味道”:
以原始形式分析数据
它可以是csv、excel、分隔或格式化文件、另一个数据库或其他任何文件。您必须枚举有限数量的源和结构,才能进行登台。以后再介绍一些其他的资源是可以的,但是首先要集中精力,比如说,很少的资源。为每个表/字段写下名称-从一开始就把事情弄清楚。每个表/字段的写下/文档格式-这将使您很容易编写代码,并在生产中查找数据错误-例如,内容太长的文本字段。
创建临时表结构
您可以在单独的数据库、单独的模式甚至事务数据所在的同一个数据库/模式中执行此操作。数据库/模式分离主要是由于管理的目的,如限制数据库的增长、用户分析输入数据的权限等,它对“关注点分离”也很有价值。所以,把前一步写下来的结构,用它们创建表。我喜欢在每个数据源中添加另一个identity(sequence)列,以便在出于某种原因必须操作行数据时轻松地标识加载的原始数据行。
引入其他表/列
这些是计算列、批次号标识表、批次号列等。您认为需要将每个开销添加到临时表中,以使其适用于临时进程。例如,当您在一天中多次导入数据,并且执行从登台到事务数据的数据加载的流程每天运行一次。然后在开始每个数据导入之前,在Batch表中创建批次号,并在添加到每个暂存表的其他BatchNumber列中使用该编号。然后,数据加载过程将逐批加载数据。
添加约束
只有当你知道自己在做什么的时候,你才应该迈出这一步。对临时表有约束的一个原因是根本不希望看到不一致的源数据。通常,这是不需要的,您希望导入所有外部数据以进行转移。
创建数据转换/加载过程
在这里,我不是指sql server存储过程,而是存放数据所需的逻辑过程。实现可能因原始存储过程、ssis包、外部进程、sqlclr程序集等而异。底线是必须将数据从临时表中的格式A转换为事务表中的格式B。通常我在一个临时表上编写sql查询并填充事务表。您必须讨论转换失败的情况:如果原始数据中的datetime根本不是datetime怎么办?如果不希望出现空数据,应该用空数据替换它吗?例如,父子行和孤立行之间的数据不一致怎么办?顺便说一下,这个步骤是etl过程的转换部分。
最后,应该将这些数据插入到事务结构(etl加载部分)中。
当你实现它的时候,你需要一个测试平台——获取你的一些数据源并尝试在转换过程中运行它。如果其中至少有一个失败了,这是很好的,因为您发现了一些意想不到的东西,并且没有试图用它填充生产表;)
我没有介绍为etl过程创建时间表、为数据导入失败发出警报和报告、数据清理、执行匹配/合并等。此外,这里也没有介绍一些实现细节,就像您应该在ETL过程之后从暂存表中删除(或者更好地截断)导入的数据,或者让它保留在那里以拥有某种导入存档一样。这可能是一个相当复杂的过程,正确的工作概念/工具可以使之更容易。
高温高压

关于mysql - 这是解决sql中最低性能问题的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18202311/

相关文章:

mysql - rails + SQL : include join table when no join

Mysql 选择Where IN 未知列

sql - 如何在不影响原始数据库的情况下将现有备份从现有数据库还原到新数据库?

android - SQLite 以外的 Android 数据库工具?

mysql - 如何将aws公共(public)数据集导入mysql实例?

java - Java 中的 Mysql 日期格式

sql-server - 日期相关性的优化不会改变计划

sql-server - 使用 Delphi 直接连接到远程 SQL Server

SQL Server - 使用 View 而不是触发器时获取插入的记录标识值

PHP - 无法关联结果并在 MYSQL 中获取它们