mongo 唯一约束索引_Java:MySQL 基础知识+索引相关

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅,请放心关注。注:本文转载自网络,不代表本平台立场,仅供读者参考,著作权属归原创者所有。我们分享此文出于传播更多资讯之目的。如有侵权,请在后台留言联系我们进行删除,谢谢!

1.0基础知识

一张数据表中具有百万级的数据时,如何精确且快速的拿出其中某一条或多条记录成为了人们思考的问题。

   InnoDB存储引擎的出现让这个问题得到了很好的解决,InnoDB存储引擎是以索引来进行数据的组织,而索引在MySQL中也被称之为键,因此UNIQUE KEY,PRIMARY KEY约束字段会作为索引字段。

   当没有明确指出PRIMAY KEY时,InnoDB存储引擎会自动的创建一个6字节的隐藏主键用于组织数据,但是由于该主键是隐藏的所以对查询没有任何帮助。

   索引相当于一本大字典的目录,有了目录来找想要的内容就快很多,否则就只能进行一页一页的遍历查询

2.0查找过程

   索引的查找过程是依照B+树算法进行查找的,而每一张数据表都会有一个且只能有一个与之对应的树

bf45064b1a0821208dee0cf562604e35.png

   只有最下面一层节点中存储一整行记录

   第二层及第一层中黄色部分为指针

   如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

3.0索引分类

   索引分为聚集索引与辅助索引

3.1聚集索引

   聚集索引是会直接按照B+树进行查询,由于B+树的底层叶子节点是一整行记录,所以聚集索引能够十分快速的拿到一整行记录。

   值得注意的是,一张数据表中只能有一个聚集索引。

da1f328493fd5b750bf8fe6efeb0b302.png

3.2辅助索引

   辅助索引的树最底层的叶子节点并不会存储一整行记录,而是只存储单列索引的数据,并且还存储了聚集索引的信息。

   通过辅助索引进行查询时,先拿到自身索引字段的数据,再通过聚集索引拿到整行记录,也就是说辅助索引拿一整行记录而言需要最少两次查询。

   而一张数据表中可以有多个辅助索引。

0a451efb19d0d498378eec84cf13a5cd.png

4.0创建索引

4.1索引类型

索引名类型INDEX(field)普通索引,只加速查找,无约束条件PRIMARY KEY(field)主键索引,加速查找,非空且唯一约束UNIQUE(field)唯一索引,加速查找,唯一约束INDEX(field1,field2)联合普通索引PRIMARY KEY(field1,field2)联合主键索引UNIQUE(field1,field2)联合唯一索引FULLTEXT(field)全文索引SPATIAL(field)空间索引

使用场景

4.2语法介绍

   索引应当再建立表时就进行创建,如果表中已有大量数据,再进行创建索引会花费大量的时间。

-- 方法一:创建表时
  CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY [索引名] (字段名[(长度)] [ASC |DESC]) );-- 方法二:CREATE在已存在的表上创建索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
-- 方法三:ALTER TABLE在已存在的表上创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ; -- 删除索引:DROP INDEX 索引名 ON 表名字;

4.3功能测试

--  准备表,注意此时表没有设置任何类型的索引
create table s1(
id int,
number varchar(20)
);
-- 创建存储过程,实现批量插入记录delimiter $$ -- 声明存储过程的结束符号为$$ create procedure auto_insert1()
BEGIN
declare i int default 1; -- 声明定义变量
while(i < 1000000) do
insert into s1 values
(i,concat('第', i, '条记录'));
set i = i + 1;
end while;
END $$ -- 存储过程创建完毕delimiter ;-- 调用存储过程,自动插入一百万条数据call auto_insert1();

   在无索引的情况下,查找id为567891的这条记录,耗时0.03s

mysql> select * from s1 where id = 567891;
+--------+--------------------+| id | number |+--------+--------------------+| 567891 | 第567891条记录 |
+--------+--------------------+1 row in set (0.33 sec)

   接下来为id字段建立主键索引后再进行查找,耗时为0.00s

mysql> ALTER TABLE s1 MODIFY id int PRIMARY KEY;
Query OK, 0 rows affected (4.76 sec) -- 创建索引花费寺庙
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from s1 where id = 567891;
+--------+--------------------+| id | number |+--------+--------------------+| 567891 | 第567891条记录 |
+--------+--------------------+1 row in set (0.00 sec) 再次查找则快了很多

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

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

相关文章

Javascript性能优化【内联缓存】 V8引擎特性

javascript 是单线程、动态类型语言&#xff0c;那么我们在编码时候如何编写性能最优代码呢&#xff1f;下面将讲解V8引擎的内联优化。利用内联缓存这个特性我们可以编写更加优秀的代码。 什么是内联缓存 引用官方的描述&#xff1a;内联缓存&#xff08;Inline caching&#…

bootstrap 垂直居中 布局_CSS3 flex 布局必须要掌握的知识点

flex 布局已经流行好久了&#xff0c;从最开始大家都在用非官方标准的 box 布局(display: box; display: -webkit-box;)&#xff0c;到后来的各种兼容写法&#xff0c;再到后来基本上就是只用 flex 了。毕竟标准就是标准&#xff0c;虽然有时候会迟到&#xff0c;但是最终肯定还…

关于微信浏览器H5 React,Vue工程化项目input无法自动聚焦疑难杂症排查

前言 最近使用React开发微信H5搜索框自动聚焦功能&#xff0c;发现路由跳转页面后无法自动聚焦。尝试了各种方法均不生效…后来发型是异步加载组件问题&#xff0c;个人估计是微信浏览器在异步组件加载完成后导致节点失焦。 尝试过的解决方法 input 属性 autofocus —— 不生…

如何在代码中让按钮高亮_各种博客的代码高亮是如何实现的

本文来自 「Vue虚拟实验」的小伙伴 余xiaoy&#xff0c;在做 Lovue 项目的时候&#xff0c;他负责了代码高亮显示功能&#xff0c;目前实现了代码高亮、主题切换、某行代码特殊显示、显示行号等功能&#xff0c;效果如下。下面介绍如何通过 Vue 来完成这个功能&#xff1a;Vue…

解析 react、vue等路由参数的库 path-to-regexp

React-router的路由系统内部中使用的是 path-to-regexp 解析匹配路由参数。具体用法如下 const { pathToRegexp } require("path-to-regexp")const regexp pathToRegexp("/:foo/:bar"); // keys [{ name: foo, prefix: /, ... }, { name: bar, prefix:…

如何把表格做成源代码_他来了,他来了,文字、表格、公式图片识别神器V0.1测试版...

他来了&#xff0c;他来了&#xff0c;Mathpix拜拜了~~~文字、表格、公式图片识别神器V0.1测试版俺不是标题党&#xff01;&#xff01;&#xff01;开发背景日常工作中经常遇到大量的图片版文本、表格、公式需要编辑&#xff1b;用手敲&#xff1f;也太OUT了吧&#xff0c;好歹…

交叉渡线道岔规格_交叉渡线道岔选择基本原则

交叉渡线道岔简介道岔是由一条线路分支进入或超越另一条线路的连接及交叉设备分支。道岔是铁路轨道结构中必不可少的一个重要组成部分。各国铁路道岔与线路的比例&#xff0c;随铁路运量、密度的不同而有很大差异。我国是铁路运量、密度较大的国家之一&#xff0c;因此我国铁路…

Jest 只MOCK模块中的某个功能实现

单元测试某些场景下只想模拟模块中的某个功能&#xff0c;并且保留模块原有的功能。这时候我可以用 jest.requireActual 配合 jest.mock 进行实现。 jest.requireActual 该API返回实际模块而不是模拟模块&#xff0c;绕过所有有关该模块是否应接收模拟实施的检查。为什么用 je…

离线登陆_iphone手机,苹果手机如何登陆网易163邮箱

在使用iPhone系统邮箱的时候&#xff0c;我们在配置的时候可能会遇到各种各样的问题&#xff0c;导致无法在系统邮件里面使用163邮箱。主要是手机客户端的密码和网页登陆的密码是不一样的。常见问题下面就是有人在使用的时候遇到的问题&#xff1a;登陆密码错误有人知道怎么在i…

jest 单元测试模拟模块设置动态值

在单元测试中需要对组件进行动态、极端、正常状态测试&#xff0c;如果组件里使用了api那么我们想对组件进行接口多种不同响应进行测试时候就需要对模块进行动态值设置。 mockFun.mockImplementation 接受应作为模拟的实现使用的函数。模拟本身仍然会记录所有进入的调用以及来…

Vue 封装echarts饼状图(Pie)组件

目的&#xff1a;减少重复代码&#xff0c;便于维护 效果显示&#xff1a; 组件代码 <template><div class"ldw-data-content-box"><div class"ldw-chilren-box"><div class"title"><div>{{ title }}</div>…

积分上下限无穷_数学分析|第九章 定积分利用等价无穷小量和定积分定义解决数列极限问题总结...

当公式或文字展示不完全时&#xff0c;记得向左←滑动哦&#xff01;摘要&#xff1a; 当我们利用等价无穷小量时&#xff0c;不仅仅可以利用等价替换&#xff0c;有的时候我们需要利用极限的定义语言来解决问题&#xff0c;当等价无穷小量和连加数列结合在一起时&#xff0c;虽…

React 性能优化之批量处理 unstable_batchedUpdates

手动批量处理 unstable_batchedUpdates 可用于手动批量更新state&#xff0c;可以指定多个setState合并为一个更新请求。 import { useState, useLayoutEffect } from "react"; import { unstable_batchedUpdates } from "react-dom";function App() {con…

关于配置Webapck的 exclude 不过滤 node_modules Babel却没有处理转换node_modules的源码

最近对公司的项目引入了 nanoid 替换 uuid 的使用。但是在sentry日志中发现Unexpected token >的错误。立马查看编译后bunld发现 nanoid 箭头函数没有被转换。所以对此记录一下原因和解决办法。 报错的原因 1.nanoid 源码是没有经过babel转换的。 查看nanoid的源码&#x…

python语言中的注释符_各种语言中的注释符总结

各种语言中的注释符c语言/* 注释内容*/// 注释内容Pascal&#xff1a;{ 注释内容}Vb&#xff1a;Rem 注释内容‘注释内容Vbscript&#xff1a;‘注释内容rem 注释内容Javascript&#xff1a;// 注释内容/* 注释内容*/Java&#xff1a;// 注释内容/* 注释内容*/Delphi&#xff1…

关于 Taro 的 ScrollView 在Dom结构发生变化会自动回滚到顶部解决方案和原因

使用Taro开发小程序时候发现 ScrollView 会在同级节点发生增删情况下会自动会滚ScrollView到顶部&#xff0c;经过多次验证和查阅Taro原理发现这是Taro自身bug 出现回滚顶部bug的演示代码 下面有一个列表和按钮&#xff0c;点击按钮会出现加载更多的字样。但是当我们点击按钮时…

android 贝塞尔曲线_OpenGL 实践之贝塞尔曲线绘制

说到贝塞尔曲线&#xff0c;大家肯定都不陌生&#xff0c;网上有很多关于介绍和理解贝塞尔曲线的优秀文章和动态图。以下两个是比较经典的动图了。二阶贝塞尔曲线&#xff1a;三阶贝塞尔曲线&#xff1a;由于在工作中经常要和贝塞尔曲线打交道&#xff0c;所以简单说一下自己的…

Node.js Event loop 图解

直接上自己制作的流程图

支持串行隔离级别_从0到1理解数据库事务(上):并发问题与隔离级别

最近准备写一篇关于Spanner事务的分享&#xff0c;所以先分享一些基础知识&#xff0c;涉及ACID、隔离级别、MVCC、锁&#xff0c;由于太长&#xff0c;只好拆分成上下两篇&#xff1a;上&#xff1a;并发问题与隔离级别主要讲事务所要解决的问题、思路&#xff0c;先理解为什么…

mysql_unbuffered_query的_用mysql_unbuffered_query函数取大数据

昨天在做项目的时候&#xff0c;因为涉及到数据表结构的改动&#xff0c;需要进行大量数据的导入&#xff0c;那么如何高效的进行是我比较关注的。本文暂且从使用PHP脚本层面上来说&#xff0c;因为使用其他语言或其他方式也可以进行数据的重导。 在讨论这个问题的时候&#xf…