我应何时创建另一个字段作为主键?

时间:2018-07-22 22:43:33

标签: mysql performance primary-key

我正在使用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可能更适合这种情况)。

2 个答案:

答案 0 :(得分:0)

来自Primary Key Tutorial

  

因为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将无法使用索引,从而使查询速度降低了几个数量级。