Mysql 建索引规范
索引规范
今天在建线上表的时候,做了一个varchar的索引,运维说varchar的索引会占用很大的内存。
于是 上网搜了一下建索引规范
一、建表规约
【强制】(1) 存储引擎必须使用InnoDB
解读:InnoDB支持事物、行级锁、并发性能更好,CPU及内存缓存页优化使得资源利用率更高。
【强制】(2)每张表必须设置一个主键ID,且这个主键ID使用自增主键(在满足需要的情况下尽量短),除非在分库分表环境下。
解读:由于InnoDB组织数据的方式决定了需要有一个主键,而且若是这个主键ID是单调递增的可以有效提高插入的性能,避免过多的页分裂、减少表碎片提高空间的使用率。而在分库分表环境下,则需要统一来分配各个表中的主键值,从而避免整个逻辑表中主键重复。
【强制】(3)必须使用utf8mb4字符集
解读:在Mysql中的UTF-8并非“真正的UTF-8”,而utf8mb4”才是真正的“UTF-8”。
【强制】(4) 数据库表、表字段必须加入中文注释
解读:大家都别懒
【强制】(5) 库名、表名、字段名均小写,下划线风格,不超过32个字符,必须见名知意,禁止拼音英文混用。
解读:约定
【强制】(6)单表列数目必须小于30,若超过则应该考虑将表拆分
解读:单表列数太多使得Mysql服务器处理InnoDB返回数据之间的映射成本太高
【强制】(7)禁止使用外键,如果有外键完整性约束,需要应用程序控制
解读:外键会导致表与表之间耦合,UPDATE与DELETE操作都会涉及相关联的表,十分影响SQL的性能,甚至会造成死锁。
【强制】(8)必须把字段定义为NOT NULL并且提供默认值
解读:a、NULL的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化 b、NULL这种类型Msql内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多 c、NULL值需要更多的存储空,无论是表还是索引中每行中的NULL的列都需要额外的空间来标识
【强制】(9)禁用保留字,如DESC、RANGE、MARCH等,请参考Mysql官方保留字。
【强制】(10)如果存储的字符串长度几乎相等,使用CHAR定长字符串类型。
解读:能够减少空间碎片,节省存储空间。
【建议】(11)在一些场景下,考虑使用TIMESTAMP代替DATETIME。
解读:a、这两种类型的都能表达"yyyy-MM-dd HH:mm:ss"格式的时间,TIMESTAMP只需要占用4个字节的长度,可以存储的范围为(1970-2038)年,在各个时区,所展示的时间是不一样的;b、而DATETIME类型占用8个字节,对时区不敏感,可以存储的范围为(1001-9999)年。
- 【建议】(12)当心自动生成的Schema,建议所有的Schema手动编写。
解读:对于一些数据库客户端不要太过信任。
二、SQL规约
【建议】 (1) 为了充分利用缓存,不允许使用自定义函数、存储函数、用户变量。
解读:如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、Mysql库中的系统表,其查询结果都不会被缓存。比如函数NOW()或者CURRENT_DATE()会因为不同的查询时间,返回不同的查询结果。
【强制】(2)在查询中指定所需的列,而不是直接使用“ *”返回所有的列
解读:a)读取不需要的列会增加CPU、IO、NET消耗 b)不能有效的利用覆盖索引
【强制】(3)不允许使用属性隐式转换
解读:假设我们在手机号列上添加了索引,然后执行下面的SQL会发生什么?explain SELECT user_name FROM parent WHERE phone=13812345678; 很明显就是索引不生效,会全表扫描。
【建议】(4)在WHERE条件的属性上使用函数或者表达式
解读:Mysql无法自动解析这种表达式,无法使用到索引。
【强制】(5)禁止使用外键与级联,一切外键概念必须在应用层解决。
解读:外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
【建议】(6)应尽量避免在WHERE子句中使用or作为连接条件
解读:根据情况可以选择使用UNION ALL来代替OR
【强制】(7)不允许使用%开头的模糊查询
解读:根据索引的最左前缀原理,%开头的模糊查询无法使用索引,可以使用ES来做检索。
索引规约
【建议】(1)避免在更新比较频繁、区分度不高的列上单独建立索引
解读:区分度不高的列单独创建索引的优化效果很小,但是较为频繁的更新则会让索引的维护成本更高
【强制】(2) JOIN的表不允许超过五个。需要JOIN的字段,数据类型必须绝对一致; 多表关联查询时,保证被关联的字段需要有索引。
解读:太多表的JOIN会让Mysql的优化器更难权衡出一个“最佳”的执行计划(可能性为表数量的阶乘),同时要注意关联字段的类型、长度、字符编码等等是否一致。
【强制】(3)在一个联合索引中,若第一列索引区分度等于1,那么则不需要建立联合索引。
解读:索引通过第一列就能够完全定位的数据,所以联合索引的后边部分是不需要的。
【强制】(4)建立联合索引时,必须将区分度更高的字段放在左边
解读:区分度更高的列放在左边,能够在一开始就有效的过滤掉无用数据。提高索引的效率,相应我们在Mapper中编写SQL的WHERE条件中有多个条件时,需要先看看当前表是否有现成的联合索引直接使用,注意各个条件的顺序尽量和索引的顺序一致。
【建议】(5)利用覆盖索引来进行查询操作,避免回表
解读:覆盖查询即是查询只需要通过索引即可拿到所需DATA,而不再需要再次回表查询,所以效率相对很高。我们在使用EXPLAIN的结果,extra列会出现:“using index”。这里也要强调一下不要使用“SELECT * ”,否则几乎不可能使用到覆盖索引。
【建议】(6)在较长VARCHAR字段,例如VARCHAR(100)上建立索引时,应指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。
解读:索引的长度与区分度是一对矛盾体,一般对字符串类型数据,若长度为20的索引,区分度会高达90%以上,则可以考虑创建长度例为20的索引,而非全字段索引。例如可以使用SELECT COUNT(DISTINCT LEFT(lesson_code, 20)) / COUNT(*) FROM lesson;来确定lesson_code字段字符长度为20时文本区分度。
【建议】(7)如果有ORDER BY的场景,请注意利用索引的有序性。ORDER BY最后的字段是联合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能。
解读:1、假设有查询条件为WHERE a=? and b=? ORDER BY c; 存在索引:a_b_c,则此时可以利用索引排序。2、反例:在查询条件中包含了范围查询,那么索引有序性无法利用,如:WHERE a>10 ORDER BY b; 索引a_b无法排序。
【建议】(8)在where中索引的列不能某个表达式的一部分,也不能是函数的参数。
解读:即是某列上已经添加了索引,但是若此列成为表达式的一部分、或者是函数的参数,Mysql无法将此列单独解析出来,索引也不会生效。
【建议】 (9)我们在where条件中使用范围查询时,索引最多用于一个范围条件,超过一个则后边的不走索引。
解读:Mysql能够使用多个范围条件里边的最左边的第一个范围查询,但是后边的范围查询则无法使用。
【建议】 (10)在多个表进行外连接时,表之间的关联字段类型必须完全一致
解读:当两个表进行Join时,字段类型若没有完全一致,则加索引也不会生效,这里的完全一致包括但不限于字段类型、字段长度、字符集、collection等等
相关文章:
Mysql 建索引规范
索引规范 今天在建线上表的时候,做了一个varchar的索引,运维说varchar的索引会占用很大的内存。 于是 上网搜了一下建索引规范 一、建表规约 【强制】(1) 存储引擎必须使用InnoDB 解读:InnoDB支持事物、行级锁、并发…...
新基建助推数字经济,CosmosAI率先布局AI超算租赁新纪元
伦敦, 8月14日 - 在英国伦敦隆重的Raffles OWO举办的欧盟数字超算新时代战略合作签约仪式,CosmosAI、Infinite Money Fund与Internet Research Lab三方强强联手,达成了历史性的合作协议,共同迈向超算租赁新纪元。 这次跨界的合作昭示了全球…...
微服务06-分布式事务解决方案Seata
1、Seata 概述 Seata事务管理中有三个重要的角色: TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resourc…...
Wireshark有线网卡抓包报错The capture session could not be initiated on capture device
最近在使用Wireshark进行抓包排错时,选择网卡后提示报错,在此之前从未出现过,报错内容如下: 提示内容是The capture session could not be initiated on capture device,无法在捕获设备上启动捕获会话要求操作是Please…...
FreeSWITCH执行bridge时如何“制造“ringback
dialplan如果这样写: <action application"record_session" data"$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/> <action application"bridge" data"user/1001"/> 或者这样…...
Java # 类加载子系统
一、概述 1、 类加载器子系统负责从文件系统或者网络中加载.Class文件 2、classloader只负责类的加载,至于他是否能够运行由执行引擎来决定 3、加载的类的信息会存放在方法区(元空间)中 二、加载过程 1、加载阶段 1、通…...
YOLOv5改进系列(21)——替换主干网络之RepViT(清华 ICCV 2023|最新开源移动端ViT)
【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2...
安卓中常见的字节码指令介绍
问题背景 安卓开发过程中,经常要通过看一些java代码对应的字节码,来了解java代码编译后的运行机制,本文将通过一个简单的demo介绍一些基本的字节码指令。 问题分析 比如以下代码: public class test {public static void main…...
TCP的三次握手和四次挥手
文章目录 三次握手四次挥手TIME_WAITCLOSE_WAIT 使用wireshark观察 三次握手 握手的最终目的是主机之间建立连接 首先要有两个预备知识点 三次握手建立连接不一定会成功,其中最担心的就是最后一次握手失败,不过会有配套的解决方案建立好连接后是需要被…...
前后端分离------后端创建笔记(08)表单提交
本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…...
途乐证券-KDJ分别代表什么?
KDJ是一种技能剖析东西,常见于股票、期货等商场中,它的全称是随机目标(KDJ)。KDJ目标包括三条线,分别为K线、D线和J线。那么,KDJ分别代表什么呢?本文将从多个视点进行剖析。 1. KDJ的简单介绍 …...
用C语言重写的原始Matlab OpenShoe算法:深入理解和实现步态分析的关键技术
一、引言 在许多领域,如医疗健康、体育科学、虚拟现实和机器人技术中,步态分析都是一个重要的研究领域。步态分析可以帮助我们理解人体运动的机制,评估疾病的影响,优化运动员的表现,甚至设计更自然的机器人运动。Open…...
什么开放式耳机音质好?值得推荐的开放式耳机分享
与封闭式耳机相比,开放式耳机具有更为自然、真实的音质,能够更好地还原音乐现场的声音环境。以下是几款值得推荐的开放式耳机,都来看看有哪些吧。 推荐一:NANK南卡00压开放式耳机 点评:体验最好的开放式耳机没有之一…...
mac harbor的安装
harbor的安装 为什么要整这个呢,因为我在学习k8s,但是需要一个自己的镜像仓库。于是,最开始想到的就是在本地直接部署一个,还比较安全、快速。 直接下载了官方的项目,运行脚本发现出了异常,这种异常我已经…...
SetActive和Enable有什么不同?
介绍 在Unity中,SetActive和Enable都是常用的方法,用于在运行时控制对象的可见性和功能开启状态。尽管它们的目的相似,但在使用时有一些区别。 SetActive SetActive是GameObject类的方法,用于启用或禁用游戏对象及其所有子对象…...
【Vue-Router】重定向
First.vue <template><h1>First Seciton</h1> </template>Second.vue,Third.vue代码同理 UserSettings.vue <template><h1>UserSettings</h1><router-link to"/settings/children1">children1</ro…...
vulnhub靶场之ADROIT: 1.0.1
准备: 攻击机:虚拟机kali、本机win10。 靶机:Adroit: 1.0.1,下载地址:https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova,下载后直接vbox打开即可。 知识点:shell反弹(jar&…...
【非欧几里得域信号的信号处理】使用经典信号处理和图信号处理在一维和二维欧几里得域信号上应用低通滤波器研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【深入理解ES6】字符串和正则表达式
概念 字符串(String)是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol(es6新增)。 更好的Unicode支持 1. UTF-16码位 字符串里的字符有两种: 前 个码位均以16位的编码单元…...
易服客工作室:Pixwell主题 – 现代杂志/WordPress新闻主题
PixWell主题概述 Pixwell主题是一个强大、多用途和现代的WordPress杂志主题,具有像素完美的设计、出色的功能、完全响应和移动友好。它非常灵活,非常适合食谱、时尚、旅行、技术、个人或任何其他很棒的杂志和博客网站。 该主题与 Elementor、Cooked&am…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
