mysql - Mysql INSERT 操作如何针对可能的重复条目进行优化?

标签 mysql node.js multithreading performance query-optimization

在我的 NodeJs 应用程序中,我使用线程(由我自己定义)来打开计算机中的端口。有一个限制,即每个端口只能绑定(bind)一个线程。

我正在 Mysql 中维护一个表(PORTS),其中保存有关开放端口和绑定(bind)线程的数据。目前我正在使用以下方法来避免两个线程绑定(bind)到同一端口。

=> 将一个条目插入到 PORTS 表中,并将端口号作为主键。这将引发以下错误

error inserting semaphore port:10014 error Error: ER_DUP_ENTRY: Duplicate entry 'port:10014' for key 'NAME'

我捕获此错误,然后尝试另一个端口,直到不再抛出错误。

这是一个好的做法吗?或者我应该首先使用 SELECT 查询检查该值是否存在,如果不存在则插入条目? 注意 - AFAIK 在第二种方法中,SELECT 和 INSERT 可以通过使用 SQL 事务作为原子操作运行。

最佳答案

假设您有多个“客户端”尝试同时获取“端口”,那么您的第二种方法很糟糕。这是因为不同的客户端可能会潜入 SELECTINSERT 之间并抢占端口。

您的第一种方法更好,因为它是“原子”的。而且它是一个单一的 Action ,因此速度更快(并不是说速度有什么大不了的)。

关于mysql - Mysql INSERT 操作如何针对可能的重复条目进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304789/

相关文章:

c++ - PThread vs boost::thread?

android - Delphi XE5 Android 应用程序应该在线程内处理耗时任务吗?

multithreading - PostMessage 在线程中返回 "invalid window handle"

php - 使用 PHP 在 Android 中引用两个或多个 JSON 表

mysql - 如何在一列中选择具有相同值但在另一列中彼此之间必须不同的行

javascript - request post 与 axios post 解析不同的结果

javascript - Node.js Expressjs 存储和显示 html 页面的最快方法

mysql - SQL无法创建表,errno 150

MySQL 索引和 Order By 子句

mysql - 连接 ECONNREFUSED - Node js , sql