MySQL(四)--索引

MySQL的服务器,本质是在内存中的,那么所有对数据的CURD操作,全都是在对内存进行操作。

而,提高数据的CURD操作的效率,有两种方式:1、组织数据的格式(数据结构);2、算法。

而,数据结构,就是索引,即组织数据的格式。

1、没有索引的问题

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index,查询速度就可能提高成百上千倍。

即:索引的存在,提高了数据的查询效率,但是降低了数据的插入删除效率。

但是对于数据来说,大部分时间还是在于读操作。

1.1、常见索引

主键索引primary key
唯一索引unique
普通索引index
全文索引fulltext

因此,之前在表中创建“键”,其实就是在创建一个索引。

2、认识磁盘

MySQL 给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。

由冯诺依曼体系结构可知,磁盘的IO效率是很慢的。

因此,如何提高效率,是MySQL的一个重要话题。

再看看磁盘中的一个盘片:

如今,一个扇区的大小已经提升到4KB了,即4096字节。

并且如今,OS和磁盘的交互大小,就是以4KB为交互单位了。

我们在使用Linux,所看到的大部分目录或者文件,其实就是保存在硬盘当中的。

因此,最基本的,找到一个文件的全部,本质,就是在磁盘找到所有保存文件的扇区。

而对于定位扇区,是有CSH定址法的:

2.1、磁盘随机访问

本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。

2.2、磁盘连续访问

如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始这次 IO操作,这样的多个IO操作称为连续访问。

因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随 机访问,而非连续访问。 磁盘是通过机械运动进行寻址的,随机访问不需要过多的定位,故效率比较高。

3、MySQL与磁盘交互单位--Page

而MySQL作为一款应用软件,可以想象成一种特殊的文件系统。

它有着更高的IO场景,所以,为了提高基本的IO效率, MySQL 进行IO的基本单位是16KB。(InnoDB,之后均已InnoDB举例了。)

mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Innodb_page_size | 16384 |   ---- 16384 = 16 * 1024+------------------+-------+1 row in set (0.01 sec)

也就是说,磁盘的基本单位是4KB,而MySQL InnoDB引擎采用16KB进行IO交互。

这个16KB,在MySQL这里,成为Page。

4、建立共识

MySQL中的数据文件,是以Page为单位,保存在磁盘当中的。
MySQL的CURD操作,都需要计算得到对应的数据位置。
只要涉及计算操作,就要CPU参与,而为了便于CPU参与计算,一定要率先将数据移动到内存中。

所以,在特定的时间内,内存和磁盘中都是有数据的。

后续数据操作完毕后,以某种刷新策略,将数据从内存刷新到磁盘中去。

此时就涉及到内存和磁盘的IO了,此时的IO单位就是Page。        

MySQL为了更好的执行上述操作,MySQL服务器在内存中运行的时候,就在服务器内部,申请了一块被成为“Buffer Pool”的大块内存空间,来进行各种缓存。
由冯诺依曼体系可以知道,想要提高效率,必须要减少系统和磁盘的IO次数。

5、初步理解索引

5.1、建立测试表

必须要添加主键,才会默认生成主键索引。

create table if not exists user ( id int primary key,     --一定要添加主键哦,只有这样才会默认生成主键索引age int not null,name varchar(16) not null
);

 查看建表信息,默认采用的是InnoDB存储引擎。(也是我们配置过的)

mysql> show create table user \G*************************** 1. row ***************************Table: userCreate Table: CREATE TABLE `user` (`id` int(11) NOT NULL,`age` int(11) NOT NULL,`name` varchar(16) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=

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

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

相关文章

C# (WinForms) 使用 iTextSharp 库将图片转换为 PDF

iTextSharp简介 iTextSharp 是一个开源的 .NET 库,主要用于创建和操作 PDF 文档。它是 iText 的 .NET 版本,iText 是一个广泛使用的 Java 库。iTextSharp 继承了 iText 的核心功能并进行了适应 .NET 平台的调整。 iTextSharp 的主要功能包括&#xff1a…

ubuntu防火墙设置(四)——iptables语法与防火墙基础配置

前面介绍的ufw和firewall-config均为iptables的前端, 分别适合个人用户和服务器网络管理 下面介绍底层——ipables iptables是一个强大的工具,用于配置Linux系统的防火墙。以下是一些基本的使用方法和示例,帮助您入门: 基本语法 …

【中间件开发】Redis基础命令详解及概念介绍

文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…

力扣每日一题 - 999. 可以被一步捕获的棋子数

题目 还需要你前往力扣官网查看详细的题目要求 地址 1.给定一个 8 x 8 的棋盘,只有一个 白色的车,用字符 R 表示。棋盘上还可能存在白色的象 B 以及黑色的卒 p。空方块用字符 . 表示。2.车可以按水平或竖直方向(上,下,…

[UVM]在UVM环境中加入C++内存模块

摘要:要在UVM环境中实现一个内存模块并存入数据,您可以遵循以下步骤。这里会涉及C的内存建模和UVM的SystemVerilog部分的接口。在高层次上,我们将描述如何在C中实现内存模型并通过UVM的DPI接口访问它。 一、C内存模型 首先,在C中…

学习记录,正则表达式, 隐式转换

正则表达式 \\:表示正则表达式 W: 表示一个非字(不是一个字,例如:空格,逗号,句号) W: 多个非字 基本组成部分 1.字符字面量: 普通字符:在正则表达式中,大…

Selenium是广泛使用的模拟浏览器运行的库

简介 Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代 Web 浏览器。 环境 安装 pip install selenium下载Chrome驱动 系统环境…

网络练级宝典-> UDP传输层协议

目录 传输层 端口号 端口号和进程的关系 UDP协议 UDP协议格式 UDP数据封装: UDP数据分用: 面向数据报 UDP的缓冲区 UDP的缺点 基于UDP的应用层协议 传输层 端口号 我们知道端口号对应的其实就是一个进程的pid,在操作系统中二者的…

Redis原理—1.Redis数据结构

大纲 1.Redis的数据结构 2.Redis的SDS 3.Redis的链表 4.Redis的字典 5.Redis的跳跃表 6.Redis的整数集合 7.Redis的压缩列表 8.Redis的对象 9.Redis对象的几个关键属性 10.Redis的单线程为什么这么快 11.Redis的典型应用场景和说明 12.Redis的相关命令说明 1.Redis…

【Vue3中Router使用】

Vue3中Router使用 1. 安装vue-router组件2. 建两个测试页面2.1 测试页面Home.vue2.2 测试页面Category.vue 3. 创建路由对象4. 在入口main.js中引入router把App.vue改成路由页面5. 测试5.1 关闭检查解决ESlint报错5.2 改文件名解决ESlint检查报错测试WebHashHistory 和WebHisto…

python拆分Excel文件

按Sheet拆分Excel 或 按照某一列的不同值拆分Excel。文档样式如下: 结果:红色是按照Sheet名拆出的,蓝色和橙色是某个Sheet按照某列的不同值拆分的。 代码: # -*- coding: utf-8 -*- """ 拆分excel文件——按照…

交易所 Level-2 历史行情数据自动化导入攻略

用户部署完 DolphinDB 后,需要将历史股票数据批量导入数据库,再进行数据查询、计算和分析等操作。DolphinDB 开发了 ExchData 模块,主要用于沪深交易所 Level-2 行情原始数据的自动化导入,目前已支持的数据源包括: 沪…

开源ISP介绍(2)————嵌入式Vitis搭建

Vivado搭建参考前一节Vivado基于IP核的视频处理框架搭建: 开源ISP介绍(1)——开源ISP的Vivado框架搭建-CSDN博客 导出Hardware 在vivado中导出Hardware文件,成功综合—实现—生成比特流后导出硬件.xsa文件。(注意导…

Node.js JWT认证教程

Node.js JWT认证教程 1. 项目介绍 JSON Web Token (JWT) 是一种安全的跨域身份验证解决方案,在现代Web应用中广泛使用。本教程将详细讲解如何在Node.js中实现JWT认证。 2. 项目准备 2.1 初始化项目 # 创建项目目录 mkdir nodejs-jwt-auth cd nodejs-jwt-auth# …

109.【C语言】数据结构之二叉树层序遍历

目录 1.知识回顾 2.代码实现 准备工作 LevelOrder函数 代码框架 关键代码 3.执行结果 1.知识回顾 层序遍历参见106.【C语言】数据结构之二叉树的三种递归遍历方式文章 截取的部分内容 定义:按层的方式遍历(,设n为树的深度,h1-->h2-->h3-->...-->hn) 以下面…

Ruby On Rails 笔记2——表的基本知识

Active Record Basics — Ruby on Rails Guides Active Record Migrations — Ruby on Rails Guides 原文链接自取 1.Active Record是什么? Active Record是MVC模式中M的一部分,是负责展示数据和业务逻辑的一层,可以帮助你创建和使用Ruby…

安装部署PowerDNS--实现内网DNS解析

PDNS是PowerDNS的缩写,是一个开源的DNS服务器软件。PowerDNS具有高性能、灵活性和可扩展性,可用于搭建各种规模的DNS解析服务。它支持多种后端数据库(如MySQL、PostgreSQL等),提供高度定制化的配置选项,并具…

13.在 Vue 3 中使用OpenLayers加载鹰眼控件示例教程

在 WebGIS 开发中,鹰眼控件 是一个常用的功能,它可以为用户提供当前地图位置的概览,帮助更好地定位和导航。在本文中,我们将基于 Vue 3 的 Composition API 和 OpenLayers,创建一个简单的鹰眼控件示例。 效果预览 在最…

Elasticsearch 单节点安全配置与用户认证

Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞:Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时,需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤,为单节…

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本:MySQL 服务器系统和 MySQL 嵌入…