mysql对于unique

64次阅读
没有评论

共计 2009 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章主要介绍“mysql 对于 unique_checks 的支持”,在日常操作中,相信很多人在 mysql 对于 unique_checks 的支持问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql 对于 unique_checks 的支持”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

unique_checks   这个参数是用于检查主键和唯一键是否重复的参数.
tokudb 与 innodb 对于这个参数有很大区别.
开启 (unique_checks=1 or on) 时没什么区别.. 都是要需要检查唯一性.
关闭 (unique_checks=0 or off) 时, 就有区别了
在 unique_checks 关闭状态, 不管什么引擎, 有两个情况下, 性能提升还是客观的:
1. 只有 primary key 且是 auto-increment 的和 secondary index , 没有 unique index, 这个时候关闭 unique_checks, 批量插入的性能还是有很乐观的提升的.
2.primary key 有大量随机数据(就是离散值很大), 或者 unique index 有大量随机数据(离散值很大), 批量插入的性能也会有很高的提升;

接下来说说 innodb 与 tokudb 的区别:
innodb:off 只是关闭 secondary indexs. 其实这句话有点多余. 只要不是 unique index, 检不检查其实效果差别不大. 官方宣称, 关闭 unique_checks 可以提升批量 insert 性能.secondary indexs. 仔细研究了下. 在批量插入时, 不管 secondary index 如何进行组织或更新(插入数据后, 索引也会更新或者可能重新组织),primary key 和 unique index 都需要更新或重新组织. 所以在 innodb 下, 这个参数的性能提升意义不是很大.

tokudb:off 状态就不一样了. 在 off 状态下, 只检查 primary key 是否重复. 目前 tokudb 的索引还在研究阶段, 所以就只参考官方手册的说法: 在 off 状态下, 将提升批量 insert 的效率 (前提是不仅有 primary, 还得有其他索引, 不然, 效果就不明显了).
在关闭 unique_checks 状态下, 除了 primary 不能重复外,unique index 和其他索引是可以重复的. 这算是超级 bug 了. 都允许重复了, 还 unique? 而且在 primary 相同,unique 不一样的两条 insert, 后面一条会覆盖前面一条的数据, 这个就太坑了 … 如下例:
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)

有此可知, 关闭 unique_checks 也是存在隐患的. 如果大量 primary 重复, 前面的数据都会被覆盖(只保留最后一个重复的数据), 且 secondary index 很容易会遭到破坏, 这个时候可能就需要重建索引, 由此的代价, 反而性能损失更大.

到此,关于“mysql 对于 unique_checks 的支持”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2009字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)