MySQL普通索引与唯一索引

索引作用:

提高查询效率,一般加在经常查询或者排序的字段上。

普通索引:

允许字段值重复

唯一索引:

保证数据记录唯一性

如何选择:

查询过程:

  • 对普通索引来说,找到满足条件的第一个记录之后,需要继续查找下一条记录,直到下一条记录不满足条件为止。
  • 对唯一索引来说,查找到第一条满足条件的数据之后,就会停止检索(唯一性)

查询效率:

相差不大

  • InnoDB的数据是以页(16KB大小)为单位进行读写
  • 一个数据页可以存放数千个Key
  • 普通索引通常情况下多了一次指针寻找和判断,较低概率跨数据页查找

更新过程:

change buffer:

  • 更新一组数据时,若数据页在内存中就直接更新;

  • 若不在内存中,更新操作缓存进change buffer中,待下一次查询访问此数据页时,读入内存,执行操作;

  • 可持久化,在内存中有拷贝,会被写入磁盘;

  • merge(将change buffer中的数据写入原数据页)的时机:

    1. 访问这个数据页
    2. 系统后台线程定期merge
    3. 数据库正常关闭(shut down)
  • 可以减少读磁盘,提高执行效率。

若更新的目标页在内存中:

唯一索引:

找到插入的位置,判断有无冲突,执行更新操作

普通索引:

直接进行更新操作

若数据页不在内存中:

  • 唯一索引:将数据页读入内存,判断有无冲突,插入这个值,
  • 普通索引:将更新记录在change buffer中,适合写多读少的情景,如果写完立刻又进行读操作,触发merge,增加了changebuffer的维护成本。

结论:

  • 二者在查询效率上差别不大
  • 更新效率上有差别,普通索引可以和change buffer两两配合
  • 业务正确性优先,如果业务无法保证不会插入重复数据,并且要求数据库做约束,必须创建唯一索引

mysql中唯一索引和普通索引的用途及区别

唯一索引和普通索引使用的结构都是B-tree,执行时间复杂度都是O(log n)。

1、普通索引

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。索引名称习惯用idx_…命名。

2、唯一索引

普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。 如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。索引名称习惯用uk_…命名。

MySQL普通索引与唯一索引__mysql中唯一索引和普通索引的用途及区别相关推荐

  1. python多维列表索引越界怎么处理_Python中remove漏删和索引越界问题的解决

    list.remove方法在删除元素的时候往往会出现漏删或者索引越界的情况示例如下: 漏删: lst=[9,25,12,36] for i in lst: if i>10: lst.remove ...

  2. oracle 创建索引指定表空间,Oracle中如何把表和索引放在不同的表空间里

    因为: 1)提高性能:尽量把表和索引的表空间存储在不同在磁盘上,把两类不同IO性质的数据分开放,这样可以提高磁盘的IO总体性能: 2)便于管理:试想一下,如果索引的数据文件损坏,只要创建索引即可,不会 ...

  3. mysql between和in_MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别

    MySQL BETWEEN 用法 not可以对between...and取反. 1.数值型 BETWEEN 运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围.BETWEEN 同 AND ...

  4. Java中拦截器和过滤器的声明用途和区别

    过滤器: 1.基于Servlet框架 2.Oracle公司的任何Java Web框架都可以用 3.可以拦截任何资源,包括 .jsp .java .html等等 拦截器: 1.基于SpringMvc框架 ...

  5. 【译】SQL Server索引进阶第八篇:唯一索引

    索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就获取到的,很多的技术人员因为不恰当的创建索引,最后使得其效果适得其 ...

  6. mysql中创建唯一索引的关键字_mysql中唯一索引的关键字是什么

    mysql中唯一索引的关键字是unique index.创建唯一索引可以避免数据出现重复.唯一索引可以有多个,但索引列的值必须唯一,索引列的值允许有空值.创建唯一索引可以使用关键字UNIQUE随表一同 ...

  7. mysql唯一索引的关键字_mysql中唯一索引的关键字是什么

    mysql中唯一索引的关键字是unique index.创建唯一索引可以避免数据出现重复.唯一索引可以有多个,但索引列的值必须唯一,索引列的值允许有空值.创建唯一索引可以使用关键字UNIQUE随表一同 ...

  8. mysql中主键、普通索引、唯一索引和全文索引

    SQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录 ...

  9. mysql唯一索引的关键字,什么是mysql中唯一索引的关键字

    什么是mysql中唯一索引的关键字 发布时间:2020-07-20 09:09:40 来源:亿速云 阅读:77 作者:Leah 本篇文章为大家展示了什么是mysql中唯一索引的关键字,代码简明扼要并且 ...

最新文章

  1. 【大牛招生】李飞飞的实验室招人了!不限专业,有跨学科研究经验优先
  2. 《LeetCode力扣练习》第55题 跳跃游戏 Java
  3. java 数据库数据脱敏_Sharding-JDBC-数据脱敏
  4. java lList Map Set总结
  5. MVC、MVP和MVVC区别
  6. 摘自《解析极限编程-拥抱变化》
  7. C语言基础教程之错误处理
  8. 【使用工具和软件汇总】
  9. fat,uat,pre等环境含义
  10. heic图片格式转换jpg_如何在Mac上通过简单方法将HEIC图像转换为JPG
  11. 用matlab绘制挠度图,如何绘制载荷挠度曲线图
  12. 非常完美的PDF转换成Word转换器完全免费破解版(亲测好用)
  13. Error response from daemon: conflict: unable to delete 31f279e888c0 (must be forced) - image is bein
  14. 【备份】git命令行
  15. AS3加载外部swf资源库中的元件(MovieClip)
  16. Chatbot 聊天机器人页面交互设计
  17. char和varchar的区别
  18. 3大利器推荐,帮你写出规范漂亮的python代码
  19. Windows 下 C++ 利用 OpenCV glob 函数获取文件夹下所有文件绝对路径
  20. 微信论坛交流小程序系统毕业设计毕设(6)开题答辩PPT

热门文章

  1. javascript模块_JavaScript中的模块
  2. 不同php文件,php-不同文件夹的不同登录(会话)
  3. android so abi适配,Android NDK学习(六): so文件兼容之abiFilters的使用
  4. netfilter que_QUE的完整形式是什么?
  5. 账单cbl_CBL的完整形式是什么?
  6. 单位矩阵属性(I ^ k = I)| 使用Python的线性代数
  7. code craft_Craft.io调度中使用的重要术语
  8. Spring Boot(十)Logback和Log4j2集成与日志发展史
  9. eclipse打开文件所在目录
  10. Linux debian ubuntu安装GIMP软件