哪个DB设计更快:一个唯一索引和INSERT IGNORE,还是使用SELECT查找现有记录?

时间:2009-08-25 12:47:48

标签: mysql

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

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

我正在考虑两种设计:

  1. 每次用户访问该页面时,使列唯一并使用INSERT命令。
  2. 检查用户是否已通过表格SELECT记录在表格中,然后INSERT如果未找到记录。
  3. 哪一个更快?

6 个答案:

答案 0 :(得分:4)

绝对创建UNIQUE索引,或者更好的是,将此列设为PRIMARY KEY

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

为什么不制作此索引UNIQUE,以便您有另一个后备选项(如果由于某种原因忘记查看SELECT)?

如果您的表格为InnoDB,则无论如何都会有PRIMARY KEY,因为所有InnoDB表都按设计进行索引编排。

如果您未在表格中声明PRIMARY KEYInnoDB会将隐藏列设为主键,从而使您的表格变得更大并且您的列上没有索引。

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

您可以发出

INSERT
IGNORE
INTO    mytable
VALUES  (userid)

并检查受影响的记录数。

如果0,则存在密钥违规,但没有例外。

答案 1 :(得分:2)

如何使用REPLACE

如果用户已经存在,则会被替换,如果没有,则插入新行。

答案 2 :(得分:1)

如何进行更新,例如

UPDATE xxx SET x=x+1 WHERE userid=y

如果失败(例如没有匹配的行),那么为新用户插入?

答案 3 :(得分:1)

SELECT速度更快......但你不喜欢SELECT检查,因为这样做,但是要避免发生错误..

答案 4 :(得分:0)

orrrrrrr

INSERT INTO xxx (`userid`) VALUES (4) ON DUPLICATE KEY UPDATE userid=VALUE(`userid`)

答案 5 :(得分:0)

在任何情况下都应该让它独一无二。

首先使用SELECT检查,取决于最常见的场景。如果您始终拥有新用户,并且只有现有用户,那么系统可能总体上更快地插入并捕获发生这种情况的罕见事件中的异常,但异常比先检查然后插入要慢,所以如果这是一个常见的情况,它是一个现有的用户,你应该首先检查选择。