Mysql

添加索引並通過索引搜尋或添加唯一約束並讓插入失敗更好?

  • April 24, 2013

我有一張表,其中包含超過 250 萬條生產記錄,用於跟踪特定使用者是否已經查看過工作:

mysql> DESCRIBE job_views;
+--------------------+--------------+------+-----+---------+----------------+
| Field              | Type         | Null | Key | Default | Extra          |
+--------------------+--------------+------+-----+---------+----------------+
| id                 | int(11)      | NO   | PRI | NULL    | auto_increment |
| job_id             | int(11)      | YES  |     | NULL    |                |
| session_id         | varchar(255) | YES  | MUL | NULL    |                |
| created_at         | datetime     | YES  |     | NULL    |                |
| updated_at         | datetime     | YES  |     | NULL    |                |
+--------------------+--------------+------+-----+---------+----------------+

在向表中添加一行之前,我想確保不存在具有相同job_idand的行session_id。目前,應用程序在表中查詢匹配的行(目前沒有索引,儘管已在兩列上添加了索引),但我相信唯一約束更有意義。

SELECT使用索引和INSERT如果沒有找到行與INSERT因為唯一約束而失敗之間有區別嗎?如果是這樣,哪個更可取(或者我該如何做出決定)?

使用唯一約束(唯一索引),這正是它們的用途。

不同之處在於您的程式碼。如果使用唯一約束方法,則需要擷取 dbms 將在重複條目上拋出的錯誤,但如果首先顯式檢查值,則不需要擷取錯誤。

但是,如果您不使用唯一約束方法,您並沒有真正限制數據庫級別的數據複製,從而使數據很容易被另一個應用程序破壞,甚至是粗心的開發人員正在執行的維護腳本或dba。

引用自:https://dba.stackexchange.com/questions/40814