mysql - 哪个数据库设计更快 : a unique index and INSERT IGNORE, 或使用 SELECT 查找现有记录?

标签 mysql

我有一个只有一列的表:userid。

当用户访问某个页面时,他的用户标识被插入到表中。用户 ID 是唯一的,因此该表中不应有两个相同的用户 ID。

我正在考虑两种设计:

  1. 使列唯一并在用户每次访问该页面时使用 INSERT 命令。
  2. 通过从表中SELECTing 检查用户是否已经记录在表中,如果没有找到记录则INSERTing。

哪个更快?

最佳答案

一定要创建一个 UNIQUE 索引,或者,更好的是,使该列成为 PRIMARY KEY

无论如何,您都需要一个索引来加快检查速度。

为什么不让这个索引UNIQUE 以便您有另一个后备选项(如果您出于某种原因忘记检查SELECT)?

如果您的表是 InnoDB,它无论如何都会有一个 PRIMARY KEY,因为所有 InnoDB 表都是按设计索引组织的。

如果您没有在表中声明PRIMARY KEYInnoDB 将创建一个隐藏 列作为主键,从而使您的表两倍大,并且您的列上不会有索引。

在您的列上创建PRIMARY KEY 是双赢的。

你可以发布

INSERT
IGNORE
INTO    mytable
VALUES  (userid)

并检查有多少条记录受到影响。

如果 0,则存在 key 冲突,但没有异常(exception)。

关于mysql - 哪个数据库设计更快 : a unique index and INSERT IGNORE, 或使用 SELECT 查找现有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1328074/

相关文章:

php - 无法在 php 中输出最后一个自动生成的 ID

java - MySQL - Java SSL 连接抛出错误

mysql - 如何将由值分隔的 mysql 列的值拆分为另一列?

python - 如何在Mysql触发器中将character-set-client和collat​​ion-connection从latin1更改为utf8

mysql - 使用Delphi在两个不同数据库之间传输数据

mysql - Codeigniter dbforge 库 - 将 db 用户分配给当前数据库并添加授予权限

MySQL 存储过程循环

mysql - 使用 WHERE AND GROUP BY 获取最低值的整行

php - 如何在grocerycrud中进行一对多的CRUD?

在where条件中找不到Mysql别名列