我正在使用MySQL开发家庭自动化系统。我有一些通过以太网屏蔽连接的arduino和一个使用MQTT服务器管理它们的Raspberry Pi。该服务器处理所有设备之间的通信(每个arduino仅连接到树莓派,后者处理请求并将另一个请求发送到相同或另一个arduino)。
此外,每个arduino均通过其MAC地址进行标识。
我有一个使用arduinos的输入(用于读取开关和传感器)和一个输出(用于打开和关闭灯)。每个值都存储在输入和输出表中。
设备
- id : CHAR(12) PK NOT NULL // The MAC Address
- type : VARCHAR(5) NOT NULL // I also manage a door lock system
输入
- device : CHAR(12) NOT NULL // FK from device table
- selection : TINYINT NOT NULL // Selects input port
- value : INT // Stores the input value
输出表非常相似。这两个表都有其他对我的问题不重要的字段。
当有人按下开关时,消息将发送到服务器,服务器将根据管理触发器的一组表处理请求,更新数据库并将其他消息发送回其他arduino。
我开始注意到打开灯有一些延迟,在转储了一些代码之后,我发现大部分时间都花在了数据库查询上。
如果我不使用MAC地址作为PK而创建另一个字段(INT AUTO_INCREMENT),会更好吗?在这种情况下,哪种引擎最快或更好?
PS:该服务器运行一个运行时间较长的PHP脚本(这是我开始开发该脚本时知道的最好的语言,并且我使用Web UI作为参考。我知道Python可能更适合这种情况)。
答案 0 :(得分:0)
因为MySQL处理整数的速度更快,所以整数的数据类型 键列应为整数,例如INT,BIGINT。您可以选择一个 较小的整数类型:TINYINT,SMALLINT等。但是,您应该 确保主键的整数类型的值的范围 足以存储表可能具有的所有可能的行。
如果您没有看到整个数据库的完整架构,那么很难为您提供一堆建议。但是根据我的经验,我总是喜欢让PK为自动增量整数。然后,我将使我的MAC地址成为索引(可能是唯一的)以提高连接效率。
答案 1 :(得分:0)
否,CHAR(12)
与某个大小的INT
之间的差异无法解释性能问题。当然,一个1字节的TINYINT UNSIGNED
可能会更好,但对于这样的“小”项目来说不值得。
请提供SHOW CREATE TABLE
和查询,并提供EXPLAIN SELECT
用于慢速查询。
PRIMARY KEY
通过BTree访问(请参阅Wikipedia);无论表的大小如何,以及PK中列的大小如何,它都是非常有效的。
这是我坚持查看架构的原因之一。例如,如果在一对表上CHAR
是不同的CHARACTER SET
或不同的COLLATION
,则表之间的JOIN
将无法使用索引,从而使查询速度降低了几个数量级。