mysql 添加唯一索引_浅谈Mysql索引

文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

e77e3b0a6d664501759460cbe4117677.png

我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询,直到查询到符合的数据,这样也会导致一个问题:如果没有添加索引,表中数据很大则查询数据花费的时间更多。而这时候我们为字段添加一个索引,Mysql就会快速搜索数据,可以节省大量时间。MyISAM和InnoDB是最经常使用的两个存储引擎,MyISAM和InnoDB索引都是采用B+树的数据结构,那B树和B+树的区别是什么呢?

B树B树是一种多路搜索树,搜索时从根节点开始,对节点内的有序关键字进行二分查找,如果命中则结束搜索,否则根据搜索大小结果进入左右子节点重复搜索,直到找到搜索结果。

特点:

  • 关键字分布在B树所有节点。
  • 关键字不会重复出现在多个节点。
  • 搜索可能在非叶子节点就结束。

B+树

B+树实际上是一种特殊的B树,和B树感官最明显的一个不同点在于B+树关键字只会出现在叶子结点中,并且关键字在链表中是有序的,也就是B+树的搜索最后只会在叶子结点中命中结果,那非叶子结点在B+树充当什么角色呢?非叶子节点在B+树中相当于是叶子结点的索引,而叶子结点是存储关键字数据的数据层。既然Mysql索引采用B+树的数据结构,那么相比于B树,B+树做索引的优势在哪里呢:

  • 磁盘读写代价更低。
  • 查询效率更稳定。
  • 遍历元素效率高。

讲完了B树和B+树的概念,接下来就需要开始谈谈索引了。其实Mysql索引的数据结构有两种:B+树、Hash。但是在MyISAM和InnoDB存储引擎当中只能使用B+树,索引其实总共可以分为四类:

  • 单列索引:单列索引有三种,包括普通索引、唯一索引、主键索引
  • 组合索引
  • 全文索引
  • 空间索引

单列索引

单列索引,顾名思义就是一个索引只能作用于单列,但是一个数据表可以同时拥有多个单列索引。单列索引一共有三种:普通索引、唯一索引、主键索引。

普通索引:

基本的索引类型,不会对数据加入任何限制,一样允许添加了普通索引的普通索引的数据列存在空值或重复值,添加普通索引的目的只是为了查询数据会更快一点。

唯一索引:

对单列添加唯一索引,就代表这个列只能是唯一值,比如用户表用户名可以添加唯一索引,这样用户名必须是唯一值,但是可以为空值。

主键索引:

其实就是在唯一索引的基础上,不允许列出现空值的存在。

组合索引

选中数据表的多列组合然后创建索引,但是组合索引并不是说创建成功都可以被使用,而是需要遵循最左前缀集合。也就是只有在查询条件中使用了这些字段的左边字段,组合索引才会生效。下面我们举个例子来解释下什么叫做最左前缀。

首先创建一个表test1009,并且将id, username, sex三个列组合然后添加索引。

CREATE TABLE test_10_09 ( id INT NOT NULL, username VARCHAR (20) NOT NULL, idcard VARCHAR (18), sex VARCHAR (3) NOT NULL, INDEX MultiIdx (id, username, sex))

我们说组合索引想要生效需要满足最左前缀。那什么叫做最左前缀呢?最左前缀其实就是利用组合索引中最左边的列来匹配数据,以上面的例子我们可以看到,组合索引最左边的列是id,所以说如果我们查询的条件不包括id,也就是不满足最左前缀原则,这时候查询操作是无法利用到我们创建的组合索引的。我们可以使用EXPLAIN指令来测试查询条件带与不带id会有什么效果:

17daf41551cfa20238c20c47e639eb4d.png
432f29408c166bfcae3c51a06643d188.png

可以看到我们带id查询可以通过索引去查询,但是查询不带id查询无法触发最左前缀原则,于是组合索引并没有生效。

全文索引

全文索引其实就是字面意思,使用全文索引可以在一连串文字中通过某个关键词,就可以找到包含字段的记录行。但是全文索引有着很多限制:

  • 在InnoDB存储引擎不支持使用,只允许在MyISAM存储引擎中使用。
  • 全文索引只能在char、varchar、text三种类型的数据列使用。
  • 所搜的关键字默认至少要4个字符。
  • 全局索引要借助MATCH函数。

空间索引

  • mysql 5.7开始支持空间索引。空间索引一般是适用于包含空间操作的系统,比如游戏开发。
  • 空间索引只能在GEOMETRY、POINT、LINESTRING、POLYGON4种空间数据类型的数据列使用。并且添加空间索引的数据列必须非空。
  • 在创建空间索引必须使用SPATIAL关键字。

索引优点

  • 数据表的所有数据列都可以添加索引。
  • 使用唯一索引或者主键索引可以保证数据的唯一性。
  • 使用索引可以提高查询数据的效率和性能。

索引缺点

  • 使用索引会占用一定的物理空间。
  • 数据插入以及修改都需要维护索引,会影响性能。

索引使用原则

  • 经常需要插入或者更新操作的表不宜设置太多索引,因为数据插入以及修改都需要维护索引,会影响性能。
  • 数据量少的表不建议添加索引,否则可能反而降低查询效率及性能。
  • 在列取值范围比较少时不使用索引,比如专业名只有三个取值,使用索引意义确实不大。
  • 组合索引将最经常使用的列放在第一列,保证组合索引能满足最左前缀的要求。
  • 如果列取值唯一,可以为字段添加唯一性索引,提高查询效率。
  • 索引尽量添加在数据量比较少的列上面,比如varchar(100)检索效率肯定没有varchar(30)来得快,所以说数据量多的列添加索引查询效率会更慢。

欢迎关注公众号:程序猿周先森。文章原创于微信公众号,本平台不定时更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask第一篇——URL详解

原创 2018-02-14 孟船长 自动化测试实战URL是Uniform Resource Locator的缩写,即统一资源定位符。 一个URL通常由一下几个部分组成: scheme://host:port/path/?query-stringxxx#anchor scheme:代表访问协议,一般为http&#xff0…

Linux优盘挂载卸载以及文件查看

1.插入优盘,连接到虚拟机 这一步差点整死我,老弹出这个也没在意,后来查看盘的时候找不到自己的优盘,傻眼了。 如果你的优盘也是3.0接口,那么请看3.0的正确打开方式: 找到虚拟机设置(我这里下载的是8.0版本的Centos&a…

mysql六:数据备份、pymysql模块

阅读目录 一 MySQL数据备份 二 pymysql模块 一 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境。但不能恢复到异构系统中如Windows。 #2. 逻辑备份: 备份的是建表、建库、插入等操作所执行SQL语句,适用于中…

Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件

案例一:vim创建编写txt文件 1.vim创建test.txt文件 vim test.txt 2.输入i,I,a,A,o,O,r,R均可(这里以i为例) 3.保存文件并退出vim。 a.先返回到一般模式 Esc b.冒号切换到命令行模式 : c.保存文件 :w d.退出vim :q successful 退回界面后可以再次…

Vim功能键整理(图片来自mooc)

1.一般模式 2.编辑模式 3.命令行模式

rpn风险等级评价准则_2019一建经济学习重点:技术方案经济效果评价

2019年一级建造师备考正在进行中,你是在看教材还是在刷题呢?今天优路教育小编是来送干货的,教材太厚,知识点太乱,那就来看这里的考点总结吧。接下来小编带大家一起学习《工程经济》第一章工程经济。一建《工程经济》第…

Android编程之页面跳转整理(只涉及关键步骤,需要有一定的基础,小白学习勿入)

自我学习篇: 1.创建你需要的页面,这里演示以创建一个主页和一个 子页进行跳转作为参考。 2.编写layout,这里仅需要创建一个按钮即可,至于样式美观大家可以根据需要进行自我调整。 这里需要注意的是对id的修改,自己应该起一个相对…

电脑无法打开特定网页_监理检测网校电脑微信无法打开公路试验检测视频课程的处理方法...

电脑版微信安装后,通过微信中置顶的监理检测网校公众号,菜单进入网校课程有的人会出现课程打不开,直接打开的是浏览器,无法学习,处理方法如下:电脑上打开微信,左下角三横线图标点开 &#xff0c…

Linux环境下创建运行.java文件

1.下载安装jdk。 一条yum指令就可以搞定了,也可以自己从windows上共享文件进行操作,有些复杂,这里不做详细描述。 以后熟练了,可能进行二更。 yum install java-1.8.0-openjdk* -y 这里需要注意是需要你转换到自己的root权限的 su root 截图…

Linux下的Shell编程之Helloworld.sh看过来

1.编写HelloWorld.sh vim HelloWorld.sh 2.按下i进行编辑 里面的代码如下: #!bin/sh echo "hello world!" 然后Esc退出编辑模式 然后:wq保存并退出vim 小白看参考: 小白vim指令学习 3.运行HelloWorld.sh(方式有两种) a.sh HelloWorld.sh …

Linux下删除非空文件目录

删除目录大家第一反应应该和我一样都是rmdir 但今天有一个目录里因为配置有好多文件直接烦死,不能rmdir直接删除,要是使用这个指令还要先用cd指令转换到该目录下一个个删除,实在是有点麻烦,最后终于还是找到了正确的打开方式。 …

jdk1.8配置(自我速成)

1.JAVA_HOME 变量名字:JAVA_HOME 变量值:找到自己安装jdk的目录即可,有的教程路径到了bin,但其实到不到都可以。 2.CLASSPATH 变量名:CLASSPATH 变量值: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 注意这里那个英文的点点不要少了…

Eclipse export导出war包报错(Module name is invalid.)

出于设计模式的作业过程中遇到的问题,老师要求代码文件最后大家要导出war包,前两次还好好的,今天突然报错 这里来说一下原因,也就是web项目可以导出war包,而java项目是不可以的,下面的操作其实本质上就是给…

车载电脑中控软件_数字图书馆智能化系统集成-ipad中控软件

随着社会发展进入数字化时代,智慧展厅一词,也渐渐的让我们熟悉,在打造智慧展厅的同时,“中控系统软件”功不可没,中控系统软件的可能大家对这个产品也不是特别了解,但接下来,鼎深小编所要介绍的…

Tool:Visual Studio

ylbtech-Tool:Visual StudioMicrosoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环…

const的用法以及与define使用的区别

const使用于C语言中,用于定义常变量,即用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。 因此有的时候也称定义的为只读变量。 虽然 const 定义的是只读变量,就相当于是定义一…

word activex部件不能创建对象_如何用Word批量制作员工工作证?1分钟搞定1000份!只需三步...

工作证是我们工作中很常见的东西,不过由于每个人的名字、部门、照片都不同,很多小伙伴都不知道怎么批量制作,总是傻傻地一张一张制作,这样特别浪费时间,今天小编就来跟大家分享如何批量制作!一、准备工作1、…

【Hadoop系列】HDFS

Hadoop的前世今生 什么是大数据 各行各业都会产生大量的数据,比如社交网站的意见观点,电商平台人们浏览网页停留的时间,交通运输每天产生的数据等等。这些数据大多不是结构化的,一般来说都是半结构化或者非结构化的 在以前&#x…

phpstudy使用(80端口被system占用,无法关闭和删除)

在使用phpstudy的时候直接一键启动,显示提示80端口已被占用,在尝试关闭和删除后显示被system占用,无法关闭。 这里我首先试着去用任务管理器彻底关闭删除这个进程,后来发现提示,如果删除可能会影响系统正常运行&#…

kingbase自带的驱动在哪_德国制造到底强在哪?从工博会上伺服驱动的创新上能看出真相!...

随着2014年协作机器人在中国兴起,UR、新松、达明、遨博、大族激光等企业积极布局协作机器人市场。2014-2019年,我国协作机器人销量复合增速一度超过了50%,2019年我国协作机器人产量超过8000台。但目前协作机器人和AGV的核心零部件高端市场&am…