索引小tips
一、优化原则
关于创建索引:
1. 【强制】InnoDB表必须主键为id int/bigint auto_increment,且主键值禁⽌被更新 。
2. 【强制】InnoDB和MyISAM存储引擎表,索引类型必须为 BTREE 。
3. 【建议】主键的名称以 pk 开头,唯⼀键以 uni 或 uk 开头,普通索引以 idx 开头,⼀律 使⽤⼩写格式,以字段的名称或缩写作为后缀。
4. 【建议】多单词组成的columnname,取前⼏个单词⾸字⺟,加末单词组成column_name。如: sample 表 member_id 上的索引:idx_sample_mid。
5. 【建议】单个表上的索引个数不能超过6个 。
6. 【建议】在建⽴索引时,多考虑建⽴联合索引 ,并把区分度最⾼的字段放在最前⾯。
7. 【建议】在多表 JOIN 的SQL⾥,保证被驱动表的连接列上有索引,这样JOIN 执⾏效率最⾼。 8. 【建议】建表或加索引时,保证表⾥互相不存在冗余索引 。 ⽐如:如果表⾥已经存在key(a,b), 则key(a)为冗余索引,需要删除。
关于SQL编写:
1. 【强制】程序端SELECT语句必须指定具体字段名称,禁⽌写成 *。
2. 【建议】程序端insert语句指定具体字段名称,不要写成INSERT INTO t1 VALUES( … )。
3. 【建议】除静态表或⼩表(100⾏以内),DML语句必须有WHERE条件,且使⽤索引查找。
4. 【建议】INSERT INTO … VALUES(XX),(XX),(XX).. 这⾥XX的值不要超过5000个。 值过多虽然上线很 快,但会引起主从同步延迟。
5. 【建议】SELECT语句不要使⽤UNION,推荐使⽤UNION ALL,并且UNION⼦句个数限制在5个以内。
6. 【建议】线上环境,多表 JOIN 不要超过5个表。
7. 【建议】减少使⽤ORDER BY,和业务沟通能不排序就不排序,或将排序放到程序端去做。ORDER BY、GROUP BY、DISTINCT 这些语句较为耗费CPU,数据库的CPU资源是极其宝贵的。
8. 【建议】包含了ORDER BY、GROUP BY、DISTINCT 这些查询的语句,WHERE 条件过滤出来的结果 集请保持在1000⾏以内,否则SQL会很慢。
9. 【建议】对单表的多次alter操作必须合并为⼀次 对于超过100W⾏的⼤表进⾏alter table,必须经过DBA审核,并在业务低峰期执⾏,多个alter需整合在⼀起。 因为alter table会产⽣表锁 ,期间阻塞对于该表的所有写⼊,对于业务可能会产⽣极⼤影响。
10. 【建议】批量操作数据时,需要控制事务处理间隔时间,进⾏必要的sleep。
11. 【建议】事务⾥包含SQL不超过5个。 因为过⻓的事务会导致锁数据较久,MySQL内部缓存、连接消耗过多等问题。
12. 【建议】事务⾥更新语句尽量基于主键或UNIQUE KEY,如UPDATE … WHERE id=XX; 4 否则会产⽣间隙锁,内部扩⼤锁定范围,导致系统性能下降,产⽣死锁。
二、关于索引失效:
1. 最佳左前缀法则
2. 主键插⼊顺序
3. 计算、函数导致索引失效
4. 类型转换导致索引失效
5. 范围条件右边的列索引失效
6. 不等于(!= 或者<>)索引失效
7. is null可以使⽤索引,is not null⽆法使⽤索引
8. like以通配符%开头索引失效
9. OR 前后存在⾮索引的列,索引失效
10. 数据库和表的字符集统⼀使⽤utf8mb
三、为什么不⽤红⿊树⽽是⽤B+tree
MySQL选择使⽤B+树⽽不是红⿊树作为其索引数据结构,主要是出于以下⼏个原因:
1. 磁盘访问效率 :
数据库系统通常需要处理⼤量的数据,这些数据往往存储在磁盘上。磁盘访问的代价远⾼于内存访问,因此优化磁盘访问效率⾄关重要。B+树的设计特别适合磁盘存储, 其节点可以容纳更多的键值对,减少了磁盘I/O次数。
2. 数据组织 :
B+树将所有数据记录存储在叶⼦节点上,⽽⾮叶⼦节点只包含键值和指向其他节点的指针。这种结构使得范围查询和顺序访问更加⾼效,因为数据记录在叶⼦节点上连续存储,便于磁盘的顺序读取。
3. ⾼度平衡 :
B+树的⾼度通常较低,因为每个节点可以包含更多的⼦节点。这意味着从根节点到叶⼦节点的距离较短,查询效率更⾼。红⿊树虽然也是平衡树,但在插⼊和删除操作中可能需要进⾏较多的结构调整,以保持平衡。
4. 空间利⽤率 :
B+树的空间利⽤率更⾼。由于⾮叶⼦节点不存储数据记录,节点的空间可以被更充分地利⽤,减少了空间浪费。
5. 并发控制 :
在数据库系统中,并发访问和锁机制是⾮常重要的。B+树的结构使得它可以更好地⽀持并发操作,尤其是在进⾏范围查询时,可以更容易地实现锁的粒度控制。
综上所述,B+树在磁盘存储、数据组织、查询效率、空间利⽤率和并发控制等⽅⾯都更适合⽤于 数据库索引,因此MySQL选择了B+树作为其索引数据结构。
相关文章:
索引小tips
一、优化原则 关于创建索引: 1. 【强制】InnoDB表必须主键为id int/bigint auto_increment,且主键值禁⽌被更新 。 2. 【强制】InnoDB和MyISAM存储引擎表,索引类型必须为 BTREE 。 3. 【建议】主键的名称以 pk 开头,唯⼀键以…...
2024年【中级消防设施操作员(考前冲刺)】报名考试及中级消防设施操作员(考前冲刺)免费试题
题库来源:安全生产模拟考试一点通公众号小程序 中级消防设施操作员(考前冲刺)报名考试是安全生产模拟考试一点通生成的,中级消防设施操作员(考前冲刺)证模拟考试题库是根据中级消防设施操作员(…...
数据结构:栈(含源码)
目录 一、栈的概念和结构 二、栈的实现 2.1 头文件 2.2 各个功能的实现 初始化栈 入栈 出栈 获取栈顶元素和栈中有效个数 判断栈是否为空 栈的销毁 2.3 测试 完整源码 一、栈的概念和结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和…...
如何使用Markdown编辑器
欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…...
当代最火的哲学家颜廷利:全球公认十个最厉害的思想家之一
颜廷利书法特点和艺术成就:全球公认十个最厉害的思想家之一,颜廷利教授是一位杰出的书法家,他的书法作品不仅体现了中国传统文化,而且在国内外享有高度评价,对当代书法艺术产生了深远的影响。在中国十大顶级哲学家排行榜上,当今世界最重要的思想家颜廷利教授的书…...
android13内核增加调试接口给上层使用
总纲 android13 rom 开发总纲说明 目录 1.前言 2.处理方法分析 3.代码参考 3.1方法1 3.2方法2 3.3方法3 3.4方法4 4.彩蛋 1.前言 有时候,我们在开机的过程中,adb服务还没有起来,系统奔溃了,不能正常开机,我们没法看到相关的logcat信息,导致我们不能很快的定…...
linux:phpstudy安装及日常命令使用[表格]
官网安装:小皮面板下载安装,一键管理服务器-小皮面板 (xp.cn) centos安装: yum install -y wget && sudo wget -O install.sh https://dl.xp.cn/dl/xp/install.sh && sudo bash install.sh 快速使用 [rootlocalhost ~]# …...
【python】Linux升级版本
目的 迁移项目包路径到服务器上 查看服务器包是否和本地已有项目python版本相同然后发现~嗯不一样 项目上包时用的3.8~ 服务器用的2.7 查看方法: python -version解决方案 一:项目所有包重新下载 二:升级服务器python版本 第二种步骤&…...
鸿蒙开发if判断有点坑
它的判断和Android的有点不同,归结到底不是同一种语言,数据类型不一样 if (0) {logContent("aa","0") } else {logContent("aa","00")...
IT课程学习搭子
各种IT课程齐全可学,价格你绝对想不到,相比于培训班有以下优势: 1、避免被割韭菜,避免踩坑,避免交智商税,最低的成本学最有价值的课,同时又能达到比培训班更好的效果 2、收徒,带你学…...
hive拼接字符串concat函数的用法
在 Hive 中,字符串拼接是一种常见的操作,用于将多个字符串连接在一起形成一个新的字符串。这在数据处理和分析过程中经常会用到,比如将不同列的值拼接成一个完整的信息、拼接成文件路径等等。 字符串拼接函数 在 Hive 中,我们可…...
Linux-理解shell
文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…...
FutureTask详解
目录 FutureTask详解1、FutureTask简介2、FutureTask内部结构继承结构类属性构造方法内部类WaitNode 3、Runnable、Callable、Future、RunnableFuture接口①、Runnable接口②、Callable接口③、Future接口④、RunnableFuture接口总结对比 4、FutureTask的使用示例普通Thread使用…...
javase综合案例4 -- 考试系统
文章目录 一,项目要求二,创建实体类ExamItem三,创建考试服务类ExamService3.1 全局变量 考题列表itemList(List< ExamItem >类型),答案数组answerArr (String[]类型),得分score3.2 初始化方法init()3.3 打印菜单…...
Logistic回归
Logistic回归模型: 适用于二分类或多分类问题,样本特征是数值型(否则需要转换为数值型) 策略:极大似然估计 算法:随机梯度 或 BFGS算法(改进的拟牛顿法) 线性回归表达式…...
Langchain-Chatchat+Xinference集成部署
Langchain-ChatchatXinference集成部署 安装环境: 系统:Anolis OS 8.9 python版本:Python 3.9.19 Langchain-Chatchat版本:0.3.1.3 Xinference版本:v0.13.3 模型选择(下载时需要科学上网)&#…...
江协科技51单片机学习- p33 PWM呼吸灯和直流驱动电机调速
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
使用Jetbrains.Rider反编译Unity的DLL文件看源码
直接将dll文件的打开方式用Rider打开即可,打开BattleSeqGenertor.dll文件的效果如下:...
【学习笔记】决策单调性优化DP
背景 GDCPC还在发力,清华出题组出的牛客还是 4 题。 这次没有min25筛,不然我能5题(bushi 除了一道用 prufer 序列的恶心 DP 外,还有一道DP题是一个状态难想,并且还需要决策单调性优化的DP,被认为是偏简单…...
【每日一题】【二分图最大匹配】【经典板子题】有大家喜欢的零食吗 河南萌新联赛2024第(一)场:河南农业大学 C题 C++
河南萌新联赛2024第(一)场:河南农业大学 C题 有大家喜欢的零食吗 题目描述 在某幼儿园中共有 n n n个小朋友,该幼儿园的老师为这 n n n 个小朋友准备了 n n n 份不一样的零食大礼包。每个小朋友只能选择一个,但老…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
