MySQL选择普通索引还是唯一索引(2/16)

news2024/11/26 2:02:44

普通索引和唯一索引

基本概述

MySQL中可以创建普通索引与唯一索引,这两种索引的区别是:

普通索引(Non-Unique Index),也称为非唯一索引,它允许索引中的条目具有重复的键值。普通索引的主要目的是加快查询速度,它并不关心数据的唯一性。

普通索引的特点:

  • 可以包含重复的索引键值。
  • 适用于快速查找具有相同索引值的多个记录的场景。
  • 不保证数据的唯一性。

普通索引创建方法:

CREATE INDEX idx_email ON customers(email);

唯一索引(Unique Index)是一种数据库索引,它要求索引中的所有键值都是唯一的。如果尝试插入或更新记录以产生重复的索引键值,数据库将拒绝这种操作。

唯一索引的特点:

  • 保证索引中的键值是唯一的。
  • 适用于确保数据表中某一列或列组合的唯一性,例如身份证号、用户名等。
  • 可以有效地避免数据重复,保护数据完整性。
  • 通常也会加快查询速度,尤其是在执行等值查询(例如,查询特定ID的记录)时。

唯一索引创建方法:

CREATE UNIQUE INDEX uidx_email ON customers(email);
使用场景

因为InnoDB引擎是按数据页为单位进行读写操作的,当需要读一条记录的时候,以页为单位,将其整体读入内存。在 InnoDB 中,每个数据页的大小默认是 16KB。

所以在内存中进行查询时,两种索引的性能差别很小

InnoDB存储引擎中存在Change Buffer机制。数据页目前如果在内存中,则直接更新,如果不在内存中,可以使用Change Buffer缓存对数据的更新操作,从而减少磁盘I/O操作,提高更新性能。

所以对于写多读少的场景,尤其是频繁更新场景下,Change Buffer可以显著提高性能。但如果写入后立即进行查询,Change Buffer的效果就会大打折扣。因为查询时,会强制将Change Buffer缓存Merge到磁盘。

但只有普通索引可以使用Change Buffer,而唯一索引由于需要检查唯一性约束(从磁盘加载数据后,再进行判断),不能使用Change Buffer。

所以在业务可以接受的情况下,优先考虑使用普通索引,尤其是频繁插入和更新场景。因为普通索引可以配合Change Buffer使用,从而优化更新操作。

普通索引改成唯一索引后,某个业务的库内存命中率突然从 99% 降低到了 75%,整个系统处于阻塞状态,更新语句全部堵住。是因为这个业务有大量插入数据的操作,而唯一索引没有Change Buffer,性能会降低。

Change buffer 用的是 buffer pool 里的内存,因此不能无限增大。change buffer 的大小,可以通过以下参数来动态设置。设置为 50 的时候,表示 change buffer 的大小最多只能占用 buffer pool 的 50%。

innodb_change_buffer_max_size

Buffer Pool 是一片内存空间,受制于内存空间大小。 可以通过参数来控制Buffer Pool 的大小。

innodb_buffer_pool_size

作者与版本更新计划

感谢您的阅读与支持!本文是《MySQL实战与优化》专栏中的一篇精选文章,该专栏共包含16篇文章,旨在为您提供实战中可直接应用的宝贵知识。

关注公众号【数舟】,获取作者最新动态,公众号后台回复【mysql2024】,即可免费领取这份包含16篇文章的完整的PDF专栏!

目前版本为v1.0,更新时间2024年4月10日。后续此文档更新与版本发布会同步到知识星球【数舟】中。

知识整理与创作不易,感谢大家理解与支持!

加入知识星球,您将获得更多独家内容、专栏更新以及与行业内专家和同行的互动交流机会。我们在知识星球等您,一起探索MySQL的深层次世界!

星球内目前包含300+精品文章,内容涵盖大数据、MySQL、运维、Python、调优、经验分享、数据分析等方向内容,会根据大家的学习需求更新更多方向的内容。

🔗 立即扫描下方二维码,加入知识星球,与行业精英共同成长,开启您的专属学习之旅!

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

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

相关文章

2024年第十四届MathorCup数学应用挑战赛A题解题思路

2024年第十四届MathorCup数学应用挑战赛A题解题思路点击链接加入【2024年第十四届MathorCup数学建模】: http://qm.qq.com/cgi-bin/qm/qr?_wv1027&kNol416eFZyg4AFPHCZsYfGkLnEnZ8H36&authKeyo9lIFgRfnk2U%2FfYYg1AlFJd5I456CSA2M6nlvJX2qcUockIKuMHj%2Bh…

【Java】SpringBoot快速整合mongoDB

目录 1.什么是mongoDB? 2.Docker安装mongoDB 3.SpringBoot整合mongoDB步骤 4.验证 1.什么是mongoDB? MongoDB是一种非关系型数据库,被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#x…

HWOD:最长回文子串

一、知识点 1、两层遍历&#xff0c;第一层i从0到n&#xff0c;第二层j从n到i 2、每一次的遍历&#xff0c;i确定子串的左边界l&#xff0c;j确定子串的右边界r 3、判断l和r界定的子串是否回文&#xff1a;while(l<r){如果下标为l和r的元素不相等&#xff0c;就break;l;r…

JAVAEE之Spring AOP

1. AOP概述 AOP是Spring框架的第⼆⼤核⼼(第⼀⼤核⼼是IoC) 1.1 什么是AOP&#xff1f; • Aspect Oriented Programming&#xff08;⾯向切⾯编程&#xff09; 什么是⾯向切⾯编程呢? 切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程. 什么是⾯向特定⽅法编…

python之堆的实现

堆本质是一个完全二叉树&#xff0c;分为大根堆和小根堆&#xff0c;大根堆每个结点的值都大于它的孩子的值&#xff0c;小根堆相反&#xff0c;每个结点的值都小于它的孩子的值 heapq是python的标准库&#xff0c;用于维护堆&#xff0c;非常方便 heapq库常用的几个函数 he…

(3)(3.1) 英特尔Realsense深度摄像头(三)

文章目录 前言 10 系统概述 11 手动设置配套计算机 前言 本文介绍如何将英特尔 Realsense 深度摄像头(Intel Realsense Depth Camera)与 ArduPilot 配合使用&#xff0c;以实现避障(obstacle avoidance)。该方法使用在配套计算机上运行的 Python 脚本&#xff08;非 ROS&am…

每天学点儿Python(5) -- 序列索引和切片

Python中&#xff0c;序列是指一块可存放多个值的连续内存空间&#xff0c;这些值按一定顺序排列&#xff0c;可通过每个值所在位置的编号&#xff08;称为索引&#xff09;访问它们。它类似于C/C中的数组或字符串&#xff0c;但又比数组或字符串强大很多 序列类型包括字符串、…

(洛谷P34060):海底高铁—->差分数组,贪心思想

海底高铁 题目描述 该铁路经过 N N N 个城市&#xff0c;每个城市都有一个站。不过&#xff0c;由于各个城市之间不能协调好&#xff0c;于是乘车每经过两个相邻的城市之间&#xff08;方向不限&#xff09;&#xff0c;必须单独购买这一小段的车票。第 i i i 段铁路连接了…

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现PSO-LSSVM粒子群算法优化最小二乘支持向量…

掌握 C# 爬虫技术:使用 HttpClient 获取今日头条内容

摘要/导言&#xff1a; 在本文中&#xff0c;我们将探讨如何使用 C# 中的 HttpClient 类和爬虫代理IP技术来获取今日头条的内容。我们还将实现多线程技术&#xff0c;以提高数据采集的效率。 背景/引言&#xff1a; 随着信息时代的到来&#xff0c;数据已经成为了一种非常宝…

Leetcode110_平衡二叉树

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;…

机器学习machine learning

1. 概念 机器学习是从数据中提取知识。涉及统计学和人工智能&#xff0c;也被称为预测分析或统计学习。 应用领域非常广泛&#xff0c;用户习惯预测&#xff0c;个性推荐&#xff0c;分析DNA序列等等。 机器学习优势是将决策过程自动化&#xff0c;需要涉及较好的算法。如果…

如何打造高度柔性动态的智能仓储物流解决方案?

近年来&#xff0c;仓储物流行业步入自动化系统集成时代&#xff0c;以货架为存储主体的方式逐步发展成为了自动化储方式&#xff0c;核心设备也由货架转变为机器人货架&#xff0c;形成系统集成物流存储体系。河北沃克根据客户需求精准发力&#xff0c;推出了新一代海格里斯智…

九招!教做出立体感十足的地图组件,不服?还有谁

一、立体感地图在可视化大屏中的作用 在可视化大屏中&#xff0c;立体感十足的地图组件可以起到以下作用&#xff1a; 引导用户注意力&#xff1a;立体感的地图组件可以吸引用户的注意力&#xff0c;使其更加关注地图所代表的信息和数据。通过增加立体感&#xff0c;地图组件可…

Spring Security——08,自定义失败处理

自定义失败处理 一、自定义实现类1.1 实现AccessDeniedHandler1.2 实现AuthenticationEntryPoint 二、配置SpringSecurity三、测试3.1 认证失败3.2 权限不足 一键三连有没有捏~~ 我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json&#xff0c…

SpringBoot3整合RabbitMQ之二_简单队列模型案例

SpringBoot3整合RabbitMQ之二_简单队列模型案例 文章目录 SpringBoot3整合RabbitMQ之二_简单队列模型案例1. 简单队列模型1. 消息发布者1. 创建简单队列的配置类2. 发布消费Controller 2. 消息消费者3. 输出结果 1. 简单队列模型 简单队列模型就是点对点发布消息&#xff0c;有…

基于spring boot的社区医院管理服务系统

基于spring boot的社区医院管理服务系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

【MySQL】数据库开篇

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 本系列传送门 1. 什么是数据库&#xff1f; 2. 为什么使用数据库 3. 数据库的分类 4. NoSQL 与关系…

Python实现对一个IP地址和端口号列表进行nmap扫描

一.功能目的 使用python实现对一个IP地址和端口号列表进行nmap扫描 二.功能调研 根据查找得知我们需要用到python的subprocess库 1.代码示例 以下是搜到的简单的subprocess库代码 import subprocess result subprocess.run([ls, -l], capture_outputTrue, textTrue) …

使用Code开发Django_模版和CSS

转到定义 和 查看定义 在使用Django或任何其他库的过程中,我们可能需要检查这些库中的代码。VS Code提供了两个方便的命令,可以直接导航到任何代码中的类和其他对象的定义: 转到定义 在Python开发环境中,我们可以轻松地对函数、类或者其他导入模块中的成员使用“Go to Def…