MySQL高级(四):索引
基础概念
什么是索引?
索引是一种数据结构,用于加速查询的过程。它类似于书本的目录,可以快速定位数据行。MySQL 索引主要是基于 B+ 树(也有其他类型如哈希索引、全文索引等)来实现的。
为什么使用索引?
- 加速查询:索引可以显著提高查询速度,尤其是当数据量大的时候。
- 减少 I/O 操作:通过索引,可以减少数据扫描的行数,减少磁盘的 I/O 操作。
- 提高排序效率:索引可以帮助加速 ORDER BY、GROUP BY操作。
索引的缺点
- 增加存储空间:索引需要占用额外的存储空间。
- 影响写操作性能:在执行 INSERT、UPDATE或DELETE操作时,必须维护索引,这会增加一定的开销。
- 维护复杂度:过多的索引可能会影响数据库的维护和管理。
索引的构成
-  索引列:索引是基于一个或多个列创建的,这些列被称为索引列。 
-  索引类型:不同的索引类型有不同的存储和查询方式。 
常见的索引类型
主键索引(Primary Key Index)
- 主键索引是一种特殊的唯一索引,它保证索引列的值唯一且不能为空。
- 每个表只能有一个主键索引。
- 在 InnoDB 存储引擎中,主键索引决定了数据表的物理存储顺序,数据行按照主键值排序。
特点
-  唯一且非空。 
-  自动创建聚簇索引(Clustered Index)。 
示例
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100)
);
唯一索引(Unique Index)
-  唯一索引确保索引列中的所有值都是唯一的,但允许 NULL值(不同的数据库对NULL的处理可能不同)。
-  唯一索引可以用于多个字段,称为复合唯一索引。 
特点
-  保证列值唯一。 
-  可以包含多个列(联合唯一索引)。 
示例
CREATE TABLE users (id INT,email VARCHAR(100) UNIQUE
);
普通索引(Index)
-  普通索引是最常见的一种索引类型,它没有唯一性要求。 
-  适用于查询中需要频繁搜索的字段,能够显著提高查询效率。 
特点
-  没有唯一性要求。 
-  创建和维护的开销相对较小。 
示例
CREATE INDEX idx_name ON users(name);
全文索引(Full-Text Index)
-  全文索引用于对文本字段的内容进行高效的查找,尤其是在大量文本中查找包含特定词汇的记录。 
-  MySQL 支持在 CHAR、VARCHAR、TEXT等类型的字段上创建全文索引。
-  对于多种自然语言的搜索,全文索引提供了更多功能,比如布尔模式搜索。 
特点
-  适用于文本字段,支持复杂的文本搜索。 
-  支持 MATCH和AGAINST语法来进行搜索。
示例
CREATE FULLTEXT INDEX ft_index ON articles(title, content);
联合索引(Composite Index)
-  联合索引是指在多个列上创建的索引,通常用来加速包含多个条件的查询。 
-  联合索引的列顺序非常重要,查询条件中列的顺序应尽可能与联合索引的列顺序匹配,否则可能无法使用索引。 
特点
-  适用于多个列的查询。 
-  联合索引的顺序影响查询性能。 
示例
CREATE INDEX idx_name_age ON users(name, age);
空间索引(Spatial Index)
-  空间索引用于支持 MySQL 中的空间数据类型,如 GEOMETRY类型,用于处理地理空间数据。
-  在 MySQL 中,空间索引通常使用 R-Tree 数据结构。 
特点
-  适用于空间数据(例如经纬度、几何图形等)。 
-  主要用于空间数据的查询和分析。 
示例
CREATE SPATIAL INDEX sp_index ON geotable(location);
哈希索引(Hash Index)
-  哈希索引是一种基于哈希算法的索引类型,适用于等值查询。 
-  哈希索引不是 MySQL 默认的索引类型,它通常用于 MEMORY 存储引擎。 
特点
-  适用于快速的等值查询。 
-  不支持范围查询。 
示例
CREATE INDEX idx_hash ON users(name) USING HASH;
索引的优化使用
合理选择索引字段:
- 索引适用于经常用于查询条件的字段,特别是 WHERE子句中的字段。
- 对于 JOIN操作中涉及的字段,以及用于排序(ORDER BY)和分组(GROUP BY)的字段,也应考虑创建索引。
避免过多索引:
- 每个索引都需要占用存储空间,并且在数据更新时会有额外的维护开销。因此,在表中创建太多索引会影响写入性能。
考虑联合索引的顺序:
- 在联合索引中,索引列的顺序会影响查询的效率。索引的顺序应尽量与查询条件的顺序匹配。
使用覆盖索引:
- 覆盖索引是指查询中的所有列都在索引中已经包含,这样查询就不需要访问表中的数据行,只需要从索引中获取结果,进一步提高查询效率。
总结
MySQL 的索引类型多种多样,每种类型都适用于不同的场景。在设计数据库表和查询时,合理选择和使用索引,可以显著提高系统的性能,但也需要注意索引的创建和维护开销。常见的索引类型包括:主键索引、唯一索引、普通索引、全文索引、联合索引和空间索引等。根据实际需求优化索引策略,是数据库性能优化的重要组成部分。
相关文章:
MySQL高级(四):索引
基础概念 什么是索引? 索引是一种数据结构,用于加速查询的过程。它类似于书本的目录,可以快速定位数据行。MySQL 索引主要是基于 B 树(也有其他类型如哈希索引、全文索引等)来实现的。 为什么使用索引? …...
 
hhdb数据库介绍(9-21)
计算节点参数说明 checkClusterBeforeDnSwitch 参数说明: PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时,是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…...
React中组件通信的几种方式
在构建复杂的React应用时,组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步,不同组件之间的通信方式多种多样。 1. 父子组件通信 父子组件通信是 React 中最基本的通信方式之一。在这种模式下,数据是从父组件通过 props …...
python脚本实现csv中百度经纬度转84经纬度
数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...
syslog udp配置笔记
要将 /var/log/ 目录下的日志信息通过 UDP 发送到远程服务器,可以使用 rsyslog 的配置来实现。以下是详细步骤: 步骤 1:确保 rsyslog 已安装 如果 rsyslog 没有安装,请使用以下命令进行安装: 在 CentOS/RHEL: sudo yum install rsyslog在 Ubuntu/Debian: sudo apt-get i…...
 
Linux环境开启MongoDB的安全认证
文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…...
 
django基于Python的农产品销售系统的设计与实现
摘 要 随着现代人们的快速发展,农产品销售系统已成为农产品的需求。该平台采用Python技术和django搭建系统框架,后台使用MySQL数据库进行信息管理;通过个人中心、用户管理、商家管理、产品类型管理、农产品管理、系统管理、订单管理等功能&a…...
 
linux复习5:C prog
编辑 缩排 为了使C源代码更加整洁易读,可以使用一些工具来自动格式化代码,例如cb(C程序美化器)、bcpp(C美化器)和indent等。 编译 编译并链接C文件 gcc hello.c -o hello 将 hello.c 编译并链接成可执行文…...
Go语言24小时极速学习教程(三)常见标准库用法
常见标准库 常见标准库即Go语言自带的库,这里的所有包都可以通过import直接引入,如果你觉得实在是不好用,那么请先保证你学会了标准库的基础上,再学一下Gookit,特别是其中的GoUtil,千万不要轻易自己去造轮…...
大数据环境下的高效数据清洗策略
大数据环境下的高效数据清洗策略 在当今这个信息爆炸的时代,大数据已成为企业决策和科学研究不可或缺的重要资源。然而,数据的海量性、多样性和复杂性也给数据处理带来了前所未有的挑战,其中数据清洗是确保数据质量和后续分析准确性的关键步…...
 
基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段
一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时,为了实现通用的CURD,在定义实体类pojo时,会尽量将能用得上的数据库字段都定义到 pojo中,但是在查询的时候却有不一样的需求。mybatis的文档地址链接ÿ…...
Python 3 字符串
Python 3 字符串 字符串在Python中是一种基本的数据类型,用于存储文本数据。Python中的字符串是不可变的,这意味着一旦创建了一个字符串,就不能更改其内容。字符串可以用单引号()、双引号("ÿ…...
 
Android集成FCM(Firebace Cloud Messaging )
集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面,创建自己的项目 2、点击自己创建好的项目,在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…...
 
基于 RBF 神经网络辨识的单神经元 PID 模型参考自适应控制
这是一个基于 RBF 神经网络辨识 和 单神经元 PID 模型参考自适应控制 的系统框图,包含以下主要部分: RBF 神经网络模块:用于对系统进行辨识,输入误差 e(t)e(t)e(t) 和误差变化量 Δe(t)\Delta e(t)Δe(t),输出与系统特…...
 
2024年 Web3开发学习路线全指南
Web3是一个包含了很多领域的概念,不讨论币圈和链圈的划分,Web3包括有Defi、NFT、Game等基于区块链的Dapp应用的开发;也有VR、AR等追求视觉沉浸感的XR相关领域的开发;还有基于区块链底层架构或者协议的开发。 这篇文章给出的学习路…...
 
Ubuntu22.04LTS 部署前后端分离项目
一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库,过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 (停止mysql的命令为:sudo service mysql stop࿰…...
「Mac玩转仓颉内测版23」基础篇3 - 深入理解整数类型
本篇将详细讲解Cangjie中的整数类型,探讨整数的定义、操作、表示范围、进制表示、类型转换及应用场景,帮助开发者在Cangjie中灵活运用整数类型构建程序逻辑。 关键词 有符号整数与无符号整数表示范围与溢出进制表示类型转换字面量与操作 一、整数类型概…...
渗透测试导学
渗透测试导学 渗透测试概念 渗透测试是干什么? 渗透测试的定义和目的:渗透测试是一种通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全性能的评估方法。它的目的是通过识别安全问题,帮助了解当前的安全状况,从而…...
 
Django实现智能问答助手-基础配置
设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑,并设计用户界面。下面是一步一步的简要说明: 目录: QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…...
亚马逊商品详情API接口解析,Json数据示例返回
亚马逊的商品详情API接口(如Amazon Product Advertising API)允许开发者获取商品的详细信息,包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构,以及相应的解析说明。请注意,实际返回的数据结构可能会根据…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
 
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
 
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
 
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
 
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
 
Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...
