业务上具有唯一特性的字段,为什么要使用唯一索引
发布日期:2022-02-22 18:04:21 浏览次数:13 分类:技术文章

本文共 1508 字,大约阅读时间需要 5 分钟。

一、问题背景

阿里开发手册上提到了,“业务上具有唯一特性的字段,即使是多个字段的组合,也必须建立成唯一索引。不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的。”

  • 唯一索引对insert影响是什么样的呢?
  • 查找速度提升表现在什么地方?

接下来,让我们一起来探索吧…

二、问题分析

2.1 测试表建立

  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))
  1. 建立不包含唯一索引的person_plus表
CREATE TABLE person_plus (  id bigint(20) unsigned NOT NULL,  id_num BIGINT(18) unsigned NOT NULL,  PRIMARY KEY (id))

2.2 插入数据速度分析

  1. 创建向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
  1. 创建向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
  1. 执行存储过程one、two的结果
  • 执行one
    时间: 04:21.22
  • 执行two
    时间:04:11.61
  1. 结果分析
    可以看出它们的INSERT速度相差无几。

2.3 查询速度分析

  1. 查询person表
SELECT	*FROM	personWHERE	id_num = 85000

查询时间: 0.034s

  1. 查询person_plus表
SELECT	*FROM	person_plusWHERE	id_num = 85000

查询时间: 0.059s

  1. SQL性能分析
  • person查询语句分析
EXPLAIN SELECT	*FROM	personWHERE	id_num = 85000

type: const

  • person_plus查询语句分析
EXPLAIN SELECT	*FROM	person_plusWHERE	id_num = 85000

type: ALL

  1. 结果分析
    包含唯一索引的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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:多线程安全strtok函数MStrTok
下一篇:VARCHAR字段指定索引长度

发表评论

最新留言

表示我来过!
[***.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中String、StringBuilder与StringBuffer的区别? 2019-04-26
【面试篇】Java对象的hashCode()相同,equals()一定为true吗? 2019-04-26
【面试篇】Java中static和final关键字的作用是什么? 2019-04-26
【面试篇】Java中接口和抽象类的区别是什么? 2019-04-26
【Java网络编程与IO流】Java中IO流分为几种?字符流、字节流、缓冲流、输入流、输出流、节点流、处理流 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
【Java网络编程与IO流】SpringBoot + WebSocket + Netty实现实时的服务器消息推送 2019-04-26
【Leetcode刷题篇】leetcode141 环形链表II 2019-04-26