我们的应用程序从传感器组合中读取数据,并将它们与时间戳一起写入数据库。每个传感器复合体每秒插入大约5次新数据(每个数据库服务器1..10个复合体;数据包含2个通常为25kB和50kB的blob),它们是从1..3台机器读取的(简单读取如下: select * from table where sensorId=?sensorId and timestamp>?lastTimestamp
)。行永远不会更新;没有在数据库端创建报告;几天后删除旧行。只有一个表会偶尔收到更新。
该主表的主要索引是自动生成的ID,其中包含sensorid
和timestamp
的附加索引。
目前的表现非常糟糕。删除旧数据需要数小时(!),并且许多数据包不会发送到数据库,因为插入过程所需的时间比传感器读取之间的间隔长。如何在这种特定情况下优化数据库的性能?
将transaction isolation level
设置为READ_COMMITTED
看起来很有希望,innodb_lock_timeout
似乎也很有用。您能否建议在我们的特定场景中使用其他设置?
当我们摆脱接收更新的表格时,我们能获得更多可能性吗?
答案 0 :(得分:1)
删除旧数据 - PARTITION BY RANGE(TO_DAYS(...))
可让您DROP PARTITION
比执行DELETEs
更快。
更多详情:http://mysql.rjweb.org/doc.php/partitionmaint
你提到的SELECT
需要这个'复合'指数:
INDEX(sensorId, timestamp)