业务上具有唯一特性的字段,为什么要使用唯一索引
发布日期:2022-02-22 18:04:21
浏览次数:13
分类:技术文章
本文共 1508 字,大约阅读时间需要 5 分钟。
一、问题背景
阿里开发手册上提到了,“业务上具有唯一特性的字段,即使是多个字段的组合,也必须建立成唯一索引。不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的。”
- 唯一索引对insert影响是什么样的呢?
- 查找速度提升表现在什么地方?
接下来,让我们一起来探索吧…
二、问题分析
2.1 测试表建立
- 建立包含唯一索引的person表
CREATE TABLE person ( id bigint(20) unsigned NOT NULL, id_num BIGINT(18) unsigned NOT NULL, PRIMARY KEY (id), UNIQUE KEY (id_num))
- 建立不包含唯一索引的person_plus表
CREATE TABLE person_plus ( id bigint(20) unsigned NOT NULL, id_num BIGINT(18) unsigned NOT NULL, PRIMARY KEY (id))
2.2 插入数据速度分析
- 创建向person表插入100000条数据的存储过程
CREATE PROCEDURE one ()BEGIN -- 定义变量 DECLARE v_i int unsigned DEFAULT 1; WHILE v_i <= 100000 DO INSERT INTO person VALUES(v_i, v_i); SET v_i = v_i+1; END WHILE;END
- 创建向person_plus表插入100000条数据的存储过程
CREATE PROCEDURE two()BEGIN -- 定义变量 DECLARE v_i int unsigned DEFAULT 1; WHILE v_i <= 100000 DO INSERT INTO person_plus VALUES(v_i, v_i); SET v_i = v_i+1; END WHILE;END
- 执行存储过程one、two的结果
- 执行one 时间: 04:21.22
- 执行two 时间:04:11.61
- 结果分析 可以看出它们的INSERT速度相差无几。
2.3 查询速度分析
- 查询person表
SELECT *FROM personWHERE id_num = 85000
查询时间: 0.034s
- 查询person_plus表
SELECT *FROM person_plusWHERE id_num = 85000
查询时间: 0.059s
- SQL性能分析
- person查询语句分析
EXPLAIN SELECT *FROM personWHERE id_num = 85000
type: const
- person_plus查询语句分析
EXPLAIN SELECT *FROM person_plusWHERE id_num = 85000
type: ALL
- 结果分析 包含唯一索引的person查询时间为0.034s,访问类型为const、不包含唯一索引的person_plus查询时间为0.059s,访问类型为ALL。有关MySQL EXPLAIN命令的知识大家有兴趣可以百度一下。
时间:person 优于 person_plus
SQL性能:person 优于 person_plus三、结论
使用唯一索引后,Insert速度损耗可以忽略,查找速度明显提升
转载地址:https://blog.csdn.net/dongli_1996/article/details/103717223 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月06日 20时04分12秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【面试篇】数据结构-树形结构
2019-04-26
【面试篇】数据结构-哈希表
2019-04-26
【Leetcode刷题篇】leetcode88 合并两个有序数组
2019-04-26
【Leetcode刷题篇】剑指offer51 数组中的逆序对
2019-04-26
【Leetcode刷题篇】剑指offer55-平衡二叉树
2019-04-26
【Leetcode刷题篇】leetcode98 判断一棵树是否为二叉搜索树
2019-04-26
Java中arraylist和数组的相互转换
2019-04-26
【Leetcode刷题篇 】leetcode147 对链表进行插入排序
2019-04-26
【Leetcode刷题篇】leetcode148 排序链表
2019-04-26
【面试篇】Java对象的hashCode()相同,equals()一定为true吗?
2019-04-26
【面试篇】Java中static和final关键字的作用是什么?
2019-04-26
【面试篇】Java中接口和抽象类的区别是什么?
2019-04-26
【Java网络编程与IO流】Java中BIO、NIO、AIO的区别是什么?
2019-04-26
【Leetcode刷题篇】leetcode136 只出现一次的数字
2019-04-26
spring boot整合thymeleaf,支持JSP和HTML页面开发
2019-04-26
【Java网络编程与IO流】Spring boot整合SSE实现服务器实时推送流信息
2019-04-26
【Leetcode刷题篇】leetcode141 环形链表II
2019-04-26