mysql - MySQL 一张表 vs 多张表(相同数据)
问题描述
我正在建立一个网站来监控一堆物联网设备。例如,每个设备的在线/离线状态以及它可能报告的某些设备特定信息、IP 地址、温度等,这些都会有所不同。仅供参考,这些设备通过连接这些设备的处理器/计算机向我的站点报告,然后报告回(最多 255 个设备,但在大多数情况下,在 10 到 100 个设备之间)。
迄今为止,我的方法是为每个处理器创建一个新表,其中仅包含该处理器设备将驻留在其中。然而,在与一位同事的讨论中,他建议这可能不是最好的方法,因为它不是特别有效并且以后可能会出现问题,例如,如果您想稍后添加另一列,则必须将其添加到可能的 50+不同的处理器表等
相反,因为所有这些表都将具有相同的结构,例如相同数量的列等,只是设备数量(例如行)会有所不同,所以一个包含所有这些行的大表会是更好的方法吗?
我知道,在 MySQL 术语中,“扫描”是一项昂贵的操作,对于一个大表,我认为会有更多的扫描,因为我必须进行过滤,因为我每次都必须获取一个大数据集,然后将其过滤掉进入一个视图,例如针对 5000 多行的处理器或位置与许多 100 行的小表。此外,我认为此表中的数据将被写入分配,例如,每次设备离线时,离线标志都会更新,所以我不确定这是否使它更适合单个表而不是一个大表。
适当的有很多不同的方法来解决这个问题,我只是不想走下一个兔子洞,以后再后悔。如果这很重要,前端将是 PHP。
解决方案
你的朋友是对的。创建许多表来存储非常相似的数据将浪费配置时间,并且是存储此信息的低效方式。相反,创建一个表,其中包含可以区分您的机器的列(机器 ID、类型等),以及所有机器将报告的信息(温度、IP 等)的列,您将拥有一个更有条理的数据库,当您以后想要更新表时,它会更简单。
SQL 对搜索查询进行了很好的优化,除非您存储数百万行,否则我认为您在性能方面会很好。
推荐阅读
- r - 如何使用 dplyr 有条件地按组更改列中的值?
- corda - 找不到网络参数文件和兼容区域未配置/无法访问
- mongodb - $set 操作的目标数组的最后一个元素
- c# - INotifyPropertyChanged and his null event
- ruby - 如何使用 < 运算符从命令行读取文件并随后读取用户输入?
- python - 我可以返回在任何迭代中找到的值吗?
- python - Pyenv 似乎导致“错误”的 spark 可执行文件运行。如何解决?
- python - 使用相同种子、代码和数据集的不同机器上的不同精度
- angular - 如何将结构指令中的 NgControl 应用于 Angular 输入元素?
- vue.js - 在浏览器中输入 URL 路径时 VueJS 站点 404