共計 2009 個字符,預(yù)計需要花費 6 分鐘才能閱讀完成。
這篇文章主要介紹“mysql 對于 unique_checks 的支持”,在日常操作中,相信很多人在 mysql 對于 unique_checks 的支持問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql 對于 unique_checks 的支持”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學(xué)習(xí)吧!
unique_checks 這個參數(shù)是用于檢查主鍵和唯一鍵是否重復(fù)的參數(shù).
tokudb 與 innodb 對于這個參數(shù)有很大區(qū)別.
開啟 (unique_checks=1 or on) 時沒什么區(qū)別.. 都是要需要檢查唯一性.
關(guān)閉 (unique_checks=0 or off) 時, 就有區(qū)別了
在 unique_checks 關(guān)閉狀態(tài), 不管什么引擎, 有兩個情況下, 性能提升還是客觀的:
1. 只有 primary key 且是 auto-increment 的和 secondary index , 沒有 unique index, 這個時候關(guān)閉 unique_checks, 批量插入的性能還是有很樂觀的提升的.
2.primary key 有大量隨機數(shù)據(jù)(就是離散值很大), 或者 unique index 有大量隨機數(shù)據(jù)(離散值很大), 批量插入的性能也會有很高的提升;
接下來說說 innodb 與 tokudb 的區(qū)別:
innodb:off 只是關(guān)閉 secondary indexs. 其實這句話有點多余. 只要不是 unique index, 檢不檢查其實效果差別不大. 官方宣稱, 關(guān)閉 unique_checks 可以提升批量 insert 性能.secondary indexs. 仔細研究了下. 在批量插入時, 不管 secondary index 如何進行組織或更新(插入數(shù)據(jù)后, 索引也會更新或者可能重新組織),primary key 和 unique index 都需要更新或重新組織. 所以在 innodb 下, 這個參數(shù)的性能提升意義不是很大.
tokudb:off 狀態(tài)就不一樣了. 在 off 狀態(tài)下, 只檢查 primary key 是否重復(fù). 目前 tokudb 的索引還在研究階段, 所以就只參考官方手冊的說法: 在 off 狀態(tài)下, 將提升批量 insert 的效率 (前提是不僅有 primary, 還得有其他索引, 不然, 效果就不明顯了).
在關(guān)閉 unique_checks 狀態(tài)下, 除了 primary 不能重復(fù)外,unique index 和其他索引是可以重復(fù)的. 這算是超級 bug 了. 都允許重復(fù)了, 還 unique? 而且在 primary 相同,unique 不一樣的兩條 insert, 后面一條會覆蓋前面一條的數(shù)據(jù), 這個就太坑了 … 如下例:
mysql show create table t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int(11) NOT NULL,
`id2` int(11) DEFAULT NULL,
`d3` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `d3` (`d3`),
KEY `sec_key` (`id2`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql
mysql
mysql select * from t3;
+—-+——+——+
| id | id2 | d3 |
+—-+——+——+
| 1 | NULL | NULL |
| 2 | 2 | NULL |
| 3 | 3 | 3 |
| 4 | 4 | 3 |
+—-+——+——+
4 rows in set (0.00 sec)
mysql
mysql
mysql insert into t3 values (2,1,1);
Query OK, 1 row affected (0.14 sec)
mysql select * from t3;
+—-+——+——+
| id | id2 | d3 |
+—-+——+——+
| 1 | NULL | NULL |
| 2 | 1 | 1 |
| 3 | 3 | 3 |
| 4 | 4 | 3 |
+—-+——+——+
4 rows in set (0.00 sec)
有此可知, 關(guān)閉 unique_checks 也是存在隱患的. 如果大量 primary 重復(fù), 前面的數(shù)據(jù)都會被覆蓋(只保留最后一個重復(fù)的數(shù)據(jù)), 且 secondary index 很容易會遭到破壞, 這個時候可能就需要重建索引, 由此的代價, 反而性能損失更大.
到此,關(guān)于“mysql 對于 unique_checks 的支持”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>