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编程_PHP数据库编程之一MySQL优化策略概述

本文简单讲述了PHP数据库编程之MySQL优化策略。分享给大家供大家参考,具体如下:前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库。我们都知道,PHP开发中,数据的增删改查是核心。为了提升PHP的运行…

mysql六:数据备份、pymysql模块

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

测试程序运行时间

在初步学习算法的时候&#xff0c;都喜欢一个词叫优化算法&#xff0c;经常做的事情就是比较两个实现同种功能的程序的运行时间。测试运行时间的函数&#xff0c;这就来安利一波。 1.时间函数头文件 #include<time.h> 2.设置初始时间和结束时间的变量。 int begin,end; d…

python权重初始值设置_pytorch自定义初始化权重的方法

在常见的pytorch代码中&#xff0c;我们见到的初始化方式都是调用init类对每层所有参数进行初始化。但是&#xff0c;有时我们有些特殊需求&#xff0c;比如用某一层的权重取优化其它层&#xff0c;或者手动指定某些权重的初始值。核心思想就是构造和该层权重同一尺寸的矩阵去对…

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

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

Lagom学习 四 CompletionStage

Future: Java 8 之前的 Java 版本功能较弱&#xff0c;仅支持两种用法&#xff1a;要么检查 future 是否已经完成&#xff0c;要么等待 future 完成; Java 8 增加了 CompletableFuture<T> 类&#xff0c;它实现了新的 CompletionStage<T> 接口&#xff0c;并对 Fut…

网络定位-能定位到国家省份市区县街道

代码改变世界 直接上代码 package com.example.baidu;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast;import com.baidu.location.BDLocation; …

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

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

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

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

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

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

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

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

PHP和MySQL Web开发pdf

下载地址&#xff1a;网盘下载内容简介 本书将PHP开发与MySQL应用相结合&#xff0c;分别对PHP和MySQL做了深入浅出的分析&#xff0c;不仅介绍PHP和MySQL的一般概念&#xff0c;而且对PHP和MySQL的Web应用做了较全面的阐述&#xff0c;并包括几个经典且实用的例子。作者…

python stringstrip方法详解_Python 基础知识全篇-字符串(Strings)

字符串是字符的集合。单引号和双引号字符串可以包含在单引号或双引号中。my_string "This is a double-quoted string."my_string This is a single-quoted string.这种灵活的方式可以让我们在字符串中包含引号。quote "Linus Torvalds once said, Any progr…

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

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

JAVA核心技术卷2:高级特征(原书第8版)

下载地址&#xff1a;网盘下载内容简介 Java领域最有影响力和价值的著作之一&#xff0c;由拥有20多年教学与研究经验的资深Java技术专家撰写&#xff08;获Jolt大奖&#xff09;&#xff0c;与《Java编程思想》齐名&#xff0c;10余年全球畅销不衰&#xff0c;广受好评。…

python处理teradata数据库_Python脚本连接Teradata数据库

Connect Teradata frompythonBaseon Linux Ubuntu with python2.7参考网络搜索结果&#xff0c;具体出处不记得了&#xff0c;结合自身实践总结。以下操作为Linux环境&#xff0c;其他环境请自行调整。(中英文结合是因为这个总结最初也是受惠于歪果仁的分享)1, Install python …

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

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

python数据录入和分析_hive+python数据分析入门

本文作者系 leanote 的核心开发者, 多谢关注leanote. leanote官网, leanote github为什么要使用hivepython来分析数据举个例子,当年没有数据库的时候, 人们通过编程来操作文件系统, 这相当于我们编写mapreduce来分析数据.后来有了数据库, 没人再操作文件系统了(除非有其它需求)…