【发布时间】:2017-05-21 21:09:40
【问题描述】:
我有一个大型传感器数据计数表,说 SENSORS_COUNT 带有一个字符串 SID,它引用另一个具有相同主键 SID 的表 SENSOR_DEFINITIONS。由于有数百万个数据点,字符串主键上的索引变得 1) 臃肿 2) 缓慢。传感器的总数非常少(
我可以考虑 3 种不同的方法来加快查询速度:
- 使用连接表将字符串键转换为相应的整数键,并在所有查询中通过连接引用它
- 将字符串/整数转换作为哈希加载到程序内存中并在代码中引用它
- 在字符串主 ID 上使用索引(虽然会比整数慢)
我正在尝试为各种传感器构建一个系统,这些传感器可能具有不同类型的字符串 ID(但架构相同)。最好的建议是什么?
编辑 1:这是架构。是的(感谢更正),在 SENSORS_COUNT 表中,SID 不是主键
TABLE: SENSOR_DEFINITIONS (2000 records)
SID : VARCHAR(20), PRIMARY KEY
SNAME: VARCHAR(50)
TABLE: SENSORS_COUNT (N million records)
SID: VARCHAR(20)
DATETIME: TIMESTAMP
VALUE: INTEGER
【问题讨论】:
-
你怎么知道它比较慢?您是否运行过任何性能基准测试?
-
感谢指正。它不是慢,而是慢。我正在尝试找到一种比目前更快的方法。此外,问题更倾向于数据库管理员使用的最佳实践。或者推荐非 DBA 开发人员可以使用的资源。
-
性能问题应该包括 EXPLAIN ANALYZE 和一些关于表大小、索引、当前时间性能、期望时间等的信息。慢是一个相对术语,我们需要一个真正的值来比较。 MySQL 也请阅读How-to-Ask
-
注意:如果
SID是SENSORS_COUNT的主键并且SID只有2000个不同的值,则sensor_count中的记录不能超过2000条。请显示表格的真实定义。 -
这里“字符串”的确切定义会对性能产生很大影响,例如
CHAR(4) CHARACTER SET latin1在一个案例中足够大,可以容纳 2000 个传感器标识符,并且应该与 32 位整数一样有效。VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci效率会降低。
标签: mysql database postgresql database-design