MySQL不适合创建索引的11种情况
文章目录
- 前言
- 1. **数据量小的表**
- 2. **频繁更新的列**
- 3. **低选择性的列**
- 4. **频繁插入和删除的表**
- 5. **查询中很少使用的列**
- 6. **大文本或BLOB列**
- 7. **复合索引中未使用的前导列**
- 8. **频繁进行批量插入的表**
- 9. **查询返回大部分数据的表**
- 10. **临时表**
- 11. **列值频繁变化**
- 总结
前言
在MySQL中,索引是优化查询性能的重要手段,但并非所有场景都适合创建索引。索引的创建和维护需要消耗存储空间和计算资源,不当使用索引可能导致性能下降。以下是11种不适合创建索引的情况,包含详尽描述和示例说明。
1. 数据量小的表
描述:
对于数据量较小的表(如几百行),全表扫描的效率可能比使用索引更高。索引的创建和维护会增加额外的开销,而小表的查询本身已经非常快,使用索引反而可能降低性能。
示例:
假设有一个存储用户性别的表 user_gender
,只有几百行数据:
CREATE TABLE user_gender (id INT PRIMARY KEY,gender ENUM('Male', 'Female')
);
如果对该表的 gender
列创建索引:
CREATE INDEX idx_gender ON user_gender(gender);
由于性别只有两种值,查询时使用索引的效果有限,而全表扫描可能更快。
2. 频繁更新的列
描述:
如果某列的值频繁更新(如计数器、状态标志等),为其创建索引会导致索引频繁重建,增加维护成本,可能降低整体性能。
示例:
假设有一个记录用户登录次数的表 user_login_count
:
CREATE TABLE user_login_count (user_id INT PRIMARY KEY,login_count INT
);
如果对 login_count
列创建索引:
CREATE INDEX idx_login_count ON user_login_count(login_count);
每次用户登录时,login_count
都会更新,导致索引频繁调整,增加开销。
3. 低选择性的列
描述:
选择性低的列(如性别、状态标志等)区分度不高,使用索引的效果有限。索引更适合高选择性的列(如唯一ID、电子邮件等)。
示例:
假设有一个存储用户性别的表 user_gender
:
CREATE TABLE user_gender (id INT PRIMARY KEY,gender ENUM('Male', 'Female')
);
如果对 gender
列创建索引:
CREATE INDEX idx_gender ON user_gender(gender);
由于性别只有两种值,查询时使用索引的效果有限,而全表扫描可能更快。
4. 频繁插入和删除的表
描述:
对于频繁插入和删除的表,索引的维护成本较高。每次插入或删除操作都需要更新索引,可能导致性能下降。
示例:
假设有一个日志表 log_entries
,频繁插入和删除:
CREATE TABLE log_entries (id INT PRIMARY KEY,log_message TEXT,created_at TIMESTAMP
);
如果对 log_message
列创建索引:
CREATE INDEX idx_log_message ON log_entries(log_message);
频繁的插入和删除操作会导致索引频繁调整,增加维护开销。
5. 查询中很少使用的列
描述:
如果某列很少用于查询条件,为其创建索引意义不大。索引的主要作用是加速查询,如果某列不常用于查询,创建索引只会增加存储和维护成本。
示例:
假设有一个用户表 users
,其中 bio
列很少用于查询:
CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR(50),bio TEXT
);
如果对 bio
列创建索引:
CREATE INDEX idx_bio ON users(bio);
由于 bio
列很少用于查询,创建索引的意义不大。
6. 大文本或BLOB列
描述:
大文本或BLOB列创建索引会占用大量存储空间,且效率较低。MySQL对这类列的索引支持有限,通常不建议为其创建索引。
示例:
假设有一个存储文章内容的表 articles
:
CREATE TABLE articles (id INT PRIMARY KEY,title VARCHAR(100),content TEXT
);
如果对 content
列创建索引:
CREATE INDEX idx_content ON articles(content);
由于 content
列数据量较大,创建索引会占用大量存储空间,且查询效率较低。
7. 复合索引中未使用的前导列
描述:
复合索引的前导列如果未被使用,索引可能无法生效。复合索引的顺序非常重要,只有使用前导列的查询才能利用索引。
示例:
假设有一个用户表 users
,创建了复合索引:
CREATE INDEX idx_name_age ON users(last_name, first_name);
如果查询只使用 first_name
:
SELECT * FROM users WHERE first_name = 'John';
由于未使用前导列 last_name
,索引 idx_name_age
无法生效。
8. 频繁进行批量插入的表
描述:
对于频繁进行批量插入的表,索引的维护成本较高。每次插入操作都需要更新索引,可能导致插入性能下降。
示例:
假设有一个日志表 log_entries
,频繁进行批量插入:
CREATE TABLE log_entries (id INT PRIMARY KEY,log_message TEXT,created_at TIMESTAMP
);
如果对 log_message
列创建索引:
CREATE INDEX idx_log_message ON log_entries(log_message);
频繁的批量插入操作会导致索引频繁调整,增加维护开销。
9. 查询返回大部分数据的表
描述:
当查询返回表中大部分数据时,全表扫描可能比使用索引更高效。索引更适合返回少量数据的查询。
示例:
假设有一个用户表 users
,包含100万行数据:
CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100)
);
如果查询返回大部分数据:
SELECT * FROM users WHERE email LIKE '%@example.com';
由于返回的数据量较大,全表扫描可能比使用索引更高效。
10. 临时表
描述:
临时表通常用于短期操作,创建索引可能增加不必要的开销。临时表的数据量通常较小,全表扫描的效率较高。
示例:
假设有一个临时表 temp_users
:
CREATE TEMPORARY TABLE temp_users (id INT PRIMARY KEY,username VARCHAR(50)
);
如果对 username
列创建索引:
CREATE INDEX idx_username ON temp_users(username);
由于临时表的数据量较小,创建索引的意义不大。
11. 列值频繁变化
描述:
如果某列的值频繁变化,为其创建索引会导致索引频繁更新,增加维护成本。
示例:
假设有一个记录用户在线状态的表 user_status
:
CREATE TABLE user_status (user_id INT PRIMARY KEY,status ENUM('Online', 'Offline')
);
如果对 status
列创建索引:
CREATE INDEX idx_status ON user_status(status);
由于用户状态频繁变化,索引需要频繁更新,增加维护成本。
总结
索引是优化查询性能的重要工具,但并非所有场景都适合创建索引。在以下情况下,创建索引可能得不偿失:
- 数据量小的表
- 频繁更新的列
- 低选择性的列
- 频繁插入和删除的表
- 查询中很少使用的列
- 大文本或BLOB列
- 复合索引中未使用的前导列
- 频繁进行批量插入的表
- 查询返回大部分数据的表
- 临时表
- 列值频繁变化
在实际应用中,创建索引需要综合考虑数据量、查询模式、更新频率等因素,避免不必要的开销。
相关文章:
MySQL不适合创建索引的11种情况
文章目录 前言1. **数据量小的表**2. **频繁更新的列**3. **低选择性的列**4. **频繁插入和删除的表**5. **查询中很少使用的列**6. **大文本或BLOB列**7. **复合索引中未使用的前导列**8. **频繁进行批量插入的表**9. **查询返回大部分数据的表**10. **临时表**11. **列值频繁…...
shell呈现数据——在脚本中重定向
重定向输出 只需简单地重定向相应的文件描述符,就可以在脚本中用文件描述符STDOUT和STDERR在多个位置生成输出。在脚本中重定向输出的方法有两种。 临时重定向每一行。永久重定向脚本中的所有命令。 下面将具体展示这两种方法的工作原理。 1.临时重定向 如果你…...
vector容器(详解)
本文最后是模拟实现全部讲解,文章穿插有彩色字体,是我总结的技巧和关键 1.vector的介绍及使用 1.1 vector的介绍 https://cplusplus.com/reference/vector/vector/(vector的介绍) 了解 1. vector是表示可变大小数组的序列容器。…...
【初/高中生讲机器学习】0. 本专栏 “食用” 指南——写在一周年之际⭐
创建时间:2025-01-27 首发时间:2025-01-29 最后编辑时间:2025-01-29 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名高一学生,热爱计…...
SAP SD学习笔记28 - 请求计划(开票计划)之2 - Milestone请求(里程碑开票)
上一章讲了请求计划(开票计划)中的 定期请求。 SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求-CSDN博客 本章继续来讲请求计划(开票计划)的其他内容: Milestone请求(里程碑请求)。 目录 1,Miles…...
【PyTorch介绍】
PyTorch 是什么? PyTorch 是一个开源的深度学习框架,由 Facebook 的人工智能研究实验室(FAIR)开发和维护。它是一个基于 Python 的库,专为深度学习和人工智能研究设计,支持动态计算图(dynamic …...
语言月赛 202412【正在联系教练退赛】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202412] 正在联系教练退赛 题目背景 在本题中,我们称一个字符串 y y y 是一个字符串 x x x 的子串,当且仅当从 x x x 的开头和结尾删去若干个(可以为 0 0 0 个)字符后剩余的字…...
【C++】B2122 单词翻转
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 💯一、我的做法代码实现:代码解析思路分析 💯二、老师的第一种做法代码实现&a…...
redis基本数据结构
基本数据结构 String String是Redis中最常见的数据存储类型: 其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。 如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时ob…...
基于STM32景区环境监测系统的设计与实现(论文+源码)
1系统方案设计 根据系统功能的设计要求,展开基于STM32景区环境监测系统设计。如图2.1所示为系统总体设计框图。系统以STM32单片机作为系统主控模块,通过DHT11传感器、MQ传感器、声音传感器实时监测景区环境中的温湿度、空气质量以及噪音数据。系统监测环…...
使用冒泡排序模拟实现qsort函数
1.冒泡排序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int arr[] { 0,2,5,3,4,8,9,7,6,1 };int sz sizeof(arr) / sizeof(arr[0]);//冒泡排序一共排序 sz-1 趟for (int i 0; i < sz - 1; i){//标志位,如果有序,直接…...
探秘Linux IO虚拟化:virtio的奇幻之旅
在当今数字化时代,虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下,一台物理主机上能同时运行多个相互隔离的虚拟机,每个虚拟机都仿佛拥有自己独立的硬件资源,这一切是如何实现的呢?今天,就让我…...
在React中使用redux
一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步:创建模块counterStore 第二步:在store的入口文件进行子模块的导入组合 第三步:在index.js中进行store的全局注入 第四步:在组件中进行使用 第五步:在组件中…...
从 C 到 C++:理解结构体中字符串的存储与操作
对于刚入门 C/C 的程序员来说,字符串的存储和操作可能是个容易混淆的知识点。在 C 中,std::string 提供了非常友好的接口,我们可以轻松地在结构体中使用字符串类型,无需关注底层细节。然而,在 C 语言中,字符…...
2.3学习总结
图: 1.图的基本概念 2.图的存储和遍历 3.最小生成树 4.最短路径 5.拓扑排序和关键路径 一、图的基本概念 图的定义:不允许没有顶点,但边集可以为空 {无向图 {有向图:边弧,弧头(有箭头)…...
wordpress代码结构解析
WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统(CMS),广泛用于构建网站和博客。要解析 WordPress 代码,首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南: --- ### 1. *…...
使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
1. 导入必要的库 首先,导入我们需要的库:Numpy、Pytorch 和相关工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定义数据集 …...
FPGA|例化生成的PLL功能IP核
1、例化上一篇文章中调用的IP核,新建文件PLL_test.v 2、代码如图 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…...
K个不同子数组的数目--滑动窗口--字节--亚马逊
Stay hungry, stay foolish 题目描述 给定一个正整数数组 nums和一个整数 k,返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 k,则称 nums 的这个连续、不一定不同的子数组为 「好子数组 」。 例如,[1,2,…...
手机连接WIFI可以上网,笔记本电脑连接WIFI却不能上网? 解决方法?
原因:DNS受污染了 解决办法 step 1:清空域名解析记录(清空DNS) ipconfig /flushdns (Windows cmd命令行输入) step 2:重新从DHCP 获取IP ipconfig /release(释放当前IP地址) ipconfig /renew &…...
大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》
论文链接:https://arxiv.org/abs/2402.06196 摘要:自2022年11月ChatGPT发布以来,大语言模型(LLMs)因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样,大语言模型通过在大量文本数…...
C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】
目录 概述【适合0基础看的简要描述】: 上述加粗下划线的内容提取版: 从上述概述中提取的核心知识点,需背诵: 整数【包含整数,负整数和0】的原码反码补码相互转换的过程图示: 过程详细刨析:…...
本地部署与使用SenseVoice语音大模型简析
前言 SenseVoice 是一种语音基础模型,具有多种语音理解功能,包括自动语音识别 (ASR)、口语识别 (LID)、语音情感识别 (SER) 和音频事件检测 (AED)。本博客将指导您安装和使用 SenseVoice 模型,使其尽可能方便用户使用。 Github 仓库链接: ht…...
QMK启用摇杆和鼠标按键功能
虽然选择了触摸屏,我仍选择为机械键盘嵌入摇杆模块,这本质上是对"操作连续性"的执着。 值得深思的是,本次开发过程中借助DeepSeek的代码生成与逻辑推理,其展现的能力已然颠覆传统编程范式,需求描述可自动…...
排序算法与查找算法
1.十大经典排序算法 我们希望数据以一种有序的形式组织起来,无序的数据我们要尽量将其变得有序 一般说来有10种比较经典的排序算法 简单记忆为Miss D----D小姐 时间复杂度 :红色<绿色<蓝色 空间复杂度:圆越大越占空间 稳定性&…...
基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取
之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…...
【思维导图】redis
学习计划:将目前已经学的知识点串成一个思维导图。在往后的学习过程中,不断往思维导图里补充,形成自己整个知识体系。对于思维导图里的每个技术知识,自己用简洁的话概括出来, 训练自己的表达能力。...
【Git】使用笔记总结
目录 概述安装Git注册GitHub配置Git常用命令常见场景1. 修改文件2. 版本回退3. 分支管理 常见问题1. git add [中文文件夹] 无法显示中文问题2. git add [文件夹] 文件名中含有空格3. git add 触发 LF 回车换行警告4. git push 提示不存在 Origin 仓库5. Git与GitHub中默认分支…...
cf div3 998 E(并查集)
E : 给出两个简单无向图 (没有重边和自环)f g . 可以对f 进行 删边 和加边 的操作。问至少操作多少次 ,使得 f 和 g 的 点的联通情况相同(并查集的情况相同) 首先思考删边 : 对于 我 f 图存在边 e &#x…...
【C++】string类(上):string类的常用接口介绍
文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…...
[SAP ABAP] ABAP SQL跟踪工具
事务码ST05 操作步骤 步骤1:使用事务码ST05之前,将要检测的程序生成的页面先呈现出来,这里我们想看下面程序的取数操作,所以停留在选择界面 步骤2: 新建一个GUI窗口,输入事务码ST05,点击 Acti…...
OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)
文章目录 向量变换使用GLM变换(缩放、旋转、位移)将变换矩阵传递给着色器坐标系统与MVP矩阵三维变换绘制3D立方体 & 深度测试(Z-buffer)练习1——更多立方体 现在我们已经知道了如何创建一个物体、着色、加入纹理。但它们都还…...
PHP 常用函数2025.02
PHP implode() 函数 语法 implode(separator,array) 参数描述separator可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。array必需。要组合为字符串的数组。 技术细节 返回值:返回一个由数组元素组合成的字符串。PHP 版…...
17.3.4 颜色矩阵
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.3.4.1 矩阵基本概念 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,类似于数组。 由…...
1. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--前言
在我们的专栏《单体开发》中,我们实现了一个简单的记账软件的服务端,并且成功上线。随着用户数量的不断增长,问题逐渐开始显现。访问量逐渐增加,服务端的压力也随之加大。随着访问量的攀升,服务端的响应时间变得越来越…...
02.04 数据类型
请写出以下几个数据的类型: 整数 a ----->int a的地址 ----->int* 存放a的数组b ----->int[] 存放a的地址的数组c ----->int*[] b的地址 ----->int* c的地址 ----->int** 指向printf函数的指针d ----->int (*)(const char*, ...) …...
WPS动画:使图形平移、围绕某个顶点旋转一定角度
1、平移 案例三角形如下图,需求:该三角形的A点平移至原点 (1)在预想动画结束的位置绘制出图形 (2)点击选中原始图像,插入/动画/绘制自定义路径/直线 (3)十字星绘制的直线…...
想表示消息返回值为Customer集合
道奈特(240***10) 14:34:55 EA中序列图。我想表示消息返回值为 Customer 集合。目前只有一个Customer实体类,我需要另外新建一个CustomerList 类吗? 潘加宇(35***47) 17:01:26 不需要。如果是分析,在类的操作中,定义一个参数&…...
93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb
进入靶场 页面一直在刷新 在 PHP 中,date() 函数是一个非常常用的处理日期和时间的函数,所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…...
五、定时器实现呼吸灯
5.1 定时器与计数器简介 定时器是一种通过对内部时钟脉冲计数来测量时间间隔的模块。它的核心是一个递增或递减的寄存器(计数器值)。如果系统时钟为 1 MHz,定时器每 1 μs 计数一次。 计数器是一种对外部事件(如脉冲信号ÿ…...
顺序打印数字的进一步理解
之前博客写了篇博文,面试时要求使用多线程顺序打印ABC循环20次,这是我当时使用join函数实现代码: public class TestABCJoin {public static void main(String[] args) {// 创建任务Runnable taskA () -> {for (int i 0; i < 5; i) …...
使用React和Material-UI构建TODO应用的前端UI
使用React和Material-UI构建TODO应用的前端UI 引言环境准备代码解析1. 导入必要的模块2. 创建React组件3. 定义函数3.1 获取TODO列表3.2 创建TODO项3.3 更新TODO项3.4 删除TODO项3.5 处理编辑点击事件3.6 关闭编辑对话框3.7 保存编辑内容 4. 使用Effect钩子5. 渲染组件 功能实现…...
开屏广告-跳过神器
给大家介绍一款超实用的软件——SKIP,它堪称李跳跳的最佳平替!这款软件已经在Github开源免费,完全无需担心内置源问题,也无需导入任何规则。安装完成后,即可直接使用,非常便捷! 首次打开软件时…...
bat脚本实现自动化漏洞挖掘
bat脚本 BAT脚本是一种批处理文件,可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务,如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…...
如何运行Composer安装PHP包 安装JWT库
1. 使用Composer Composer是PHP的依赖管理工具,它允许你轻松地安装和管理PHP包。对于JWT,你可以使用firebase/php-jwt这个库,这是由Firebase提供的官方库。 安装Composer(如果你还没有安装的话): 访问Co…...
(回溯递归dfs 电话号码的字母组合 remake)leetcode 17
只找边界条件和非边界条件,剩下的交给数学归纳法就行,考虑子问题的重复性 [class Solution {vector<string>str { "","","abc","def","ghi","jkl","mno","pqrs"…...
it基础使用--5---git远程仓库
文章目录 it基础使用--5---git远程仓库1. 按顺序看2. 什么是远程仓库3. Gitee操作3.1 新建远程仓库3.2 远程操作基础命令3.3 查看当前所有远程地址别名 git remote -v3.4 创建远程仓库别名 git remote add 别名 远程地址3.4 推送本地分支到远程仓库 git push 别名 分支3.5 拉取…...
Git 的起源与发展
序章:版本控制的前世今生 在软件开发的漫长旅程中,版本控制犹如一位忠诚的伙伴,始终陪伴着开发者们。它的存在,解决了软件开发过程中代码管理的诸多难题,让团队协作更加高效,代码的演进更加有序。 简单来…...
c++提取矩形区域图像的梯度并拟合直线
c提取旋转矩形区域的边缘最强梯度点,并拟合直线 #include <opencv2/opencv.hpp> #include <iostream> #include <vector>using namespace cv; using namespace std;int main() {// 加载图像Mat img imread("image.jpg", IMREAD_GRAYS…...
【PyQt】超级超级笨的pyqt计算器案例
计算器 1.QT Designer设计外观 1.pushButton2.textEdit3.groupBox4.布局设计 2.加载ui文件 导入模块: sys:用于处理命令行参数。 QApplication:PyQt5 应用程序类。 QWidget:窗口基类。 uic:用于加载 .ui 文件。…...