当前位置: 首页 > news >正文

索引设计规范

索引是帮助数据库高效获取数据的数据结构。索引是加速查询的常用技术手段。在设计索引时,要遵循索引设计规范,避免不必要的踩坑。

【推荐】索引存储结构推荐BTREE

InnoDB和MyISAM存储引擎表,索引类型必须为BTRER,MEMORY表可以根据需要选择HASH或者BTREE类型索引。

【建议】单个表上的索引个数不能超过7个

索引在加速查询的同时,也会带来写入速度降低的问题(写入数据的同时,要更新索引)。应限制单表上索引个数。

【建议】利用覆盖索引来进行查询操作

覆盖查询即是查询只需要通过索引即可拿到所需数据,而不需要再次回表查询,所以效率相对很高。所谓的覆盖索引,就是索引上存储的某一条记录索引列的值,如果一个查询只需要访问索引中的数据,而无需访问实际的表时,就可以实现覆盖索引的效果。

【强制】使用联合索引时要遵循最左前缀匹配原则

所谓的联合索引就是基于多个列创建索引,也称"多码索引"、"组合索引"等。举例来说,一个表有A、B、C、D等列,如果声明(A,B,C)为一个索引,那么这个索引就是一个联合索引。联合索引遵循最左前缀匹配原则。所谓最左前缀匹配的原则,就是最左优先,在检索数据时从联合索引的最左边开始匹配,联合索引的第一个字段必须出现在查询组句中,这个索引才会被用到,对(A,B,C)的索引,数据库会同时际建立了(A)、(A,B)、(A,B,C)三个索引。
基于以上介绍,在使用联合索引时,为遵循最左匹配原则,要将使用最频繁的列放在最左,这样就能使用到索引。如上述联合索引,A应该是访问频率频率最高的列。
此外,既然联合索引会默认创建一些索引,所以没有必要重复创建索引。比如先定义(A,B,C)联合索引,则没有必要再定义(A)索引和(A,B)索引。
最后,在使用联合索引的时候,要注意联合索引无法覆盖的场景,如对于(A,B,C)联合索引,如果需要再B上使用索引,联合索引是无法覆盖的,需要单独基于B创建索引。

【推荐】多表关联查询时,保证被关联的字段有索引

多表关联查询会引入性能问题,如果表的规模很大。对于大数据量场景,需要保证被关联的字段有索引。

【建议】频繁更新的列不建议创建索引

索引不是没有代价的,索引在加速数据的检索速度的同时,因为需要维护索引对应的实现结构,当对表中的数据进行增加、删除和修改的时候,会降低增/改/删的执行效率。所以,对于需要频繁更新的字段,不建议建立索引。如果需要加速这部分数据的查询性能,首先考虑业务场景是否合理,其次考虑当前表结构设计是否合理,看看能否将业务需要的字段变成不频繁更新的列。

【强制】使用索引时,要考虑索引生效、失效的场景

索引在sql中的where子句、order by子句、join子句、select子句中会生效。但是,也要注意索引不生效的情况。索引失效的场景可以参考笔者之前的WIKI。常见的索引失效场景有:
(1) 查询条件中有or。此时,必须保证所有or相关的字段都有索引才能生效。所以要谨慎使用or语句。
(2) like语句以%开头。模糊查询时,使用%且将其放在开头,会导致索引失效。
(3) 如果存在类型转换(如存储是字符串,查询的时候未用引号,则会进行类型转换),索引会失效。
(4) 索引列参与计算会导致索引失效(如执行算数运算或使用函数)。
(5) 违背最左匹配原则。
(6) 如果Mysql 评估全表扫描要比使用索引要快,则索引失效(数据量很少,使用索引不会提升查找性能)。

【建议】如果不明确查询是否使用到索引,可使用执行计划判断

执行计划除了用来分析查询性能,还可以判断查询是否使用到了索引。执行计划的使用可以参考这篇WIKI。

参考

https://zhuanlan.zhihu.com/p/391673897 第32期:索引设计(索引设计详细规范)
https://zhuanlan.zhihu.com/p/354375388 汇总篇 | MySQL数据库设计开发规范
https://zhuanlan.zhihu.com/p/339441666 超全的数据库建表、SQL、索引规范
https://blog.csdn.net/USTC_Zn/article/details/94356505 数据库使用规范(索引规范,SQL规范,表设计规范等)
https://blog.51cto.com/u_2820398/6034597 索引与查询性能优化

相关文章:

索引设计规范

索引是帮助数据库高效获取数据的数据结构。索引是加速查询的常用技术手段。在设计索引时,要遵循索引设计规范,避免不必要的踩坑。 【推荐】索引存储结构推荐BTREE InnoDB和MyISAM存储引擎表,索引类型必须为BTRER,MEMORY表可以根…...

Appium 2安装与使用java对Android进行自动化测试

文章目录 1、Appium 2.1安装1.1、系统要求1.2、安装Appium2.1服务1.3、安装UiAutomator2驱动1.4、安装Android SDK platform tools1.5、下载OpenJDK 2、Android自动代码例子2.1、安装Android自动化测试元素定位工具Appium Inspector2.2、编写android app自动化测试代码和使用ex…...

小程序运营方式有哪些?如何构建小程序运营框架?

​如今,每个企业基本都做过至少一个小程序,但由于小程序本身不具备流量、也很少有自然流量,因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些? 在正式运营小程序前,了解小程序的功能与企业实际经…...

【golang】for语句和switch语句

使用携带range子句的for语句时需要注意哪些细节? numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容? 答案:[1 2 3 7 5 6] 当for语句被执行…...

三、数据库索引

1、索引介绍 索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。 常见的索引结构有:B数,B树,Hash和红黑树等。在MySQL中,无论是 InnoDB还是MyISAM,都使用了B树作为索引…...

长时间带什么耳机最舒服,分享长时间佩戴舒服的耳机推荐

时代在进步,科技在不断革新。近年来,一种崭新的耳机——骨传导耳机,如火如荼地进驻耳机市场,引起一阵热潮。不论是平日里的工作出勤还是运动时的挥洒汗水,相比传统耳机,骨传导耳机无疑更加贴合现代生活的需…...

Yolov8小目标检测(1)

💡💡💡本文目标:通过原始基于yolov8的红外弱小目标检测,训练得到初版模型,进行问题点分析; 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,带你轻松实现小目标检测涨点 💡💡…...

GPS定位漂移问题分析

有很多种因素会影响到GPS的准确率,以下是一个GPS误差引入简表: l 卫星时钟误差:0-1.5米 l 卫星轨道误差:1-5米 l 电离层引入的误差:0-30米 l 大气层引入的误差:0-30米 l 接收机…...

前端简介(HTML+CSS+JS)

学习Django过程中遇到一些前端相关的内容,于是整理了一下相关概念。 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程。 如果只是想要入门前端,只要学习网页三剑客(HTML、CSS、JavaScript)即可。 如果把网页比喻成一个房子,HTML就是…...

List与String数组互转

一.List 转为 String 数组 1.使用toArray方法 public static void main(String[] args) {List<String> list Lists.newArrayList("1","2","3");// Java6以前版本String[] str1 list.toArray(new String[list.size()]);// Java6以后版本…...

MySQL中的数据类型

文章目录 1 常见的数据类型2 整数类型2.1 属性 M2.2 属性 UNSIGNED2.3 属性 ZEROFILL2.4 整数类型的适用场景 3 浮点类型4 定点类型5 位类型6 日期与时间类型6.1 YEAR 类型6.2 DATE 类型6.3 TIME 类型6.4 DATETIME 类型6.5 TIMESTAMP 类型 1 常见的数据类型 类型类型分类整数类…...

python多任务

​ 一、多任务 1.1 概念 多任务就是指&#xff1a;同一时间能执行多个任务。比方我们的电脑能一边QQ聊天&#xff0c;一边写论文&#xff0c;还能听歌。 1.2 多任务的优势&#xff1a; 多任务的最大好处是 充分利用CPU资源&#xff0c;提高程序的执行效率。 1.3 多任务的两种表…...

c语言 - inline关键字(内联函数)

概念 在编程中&#xff0c;inline是一个关键字&#xff0c;用于修饰函数。inline函数是一种对编译器的提示&#xff0c;表示这个函数在编译时应该进行内联展开。 内联展开是指将函数的代码插入到调用该函数的地方&#xff0c;而不是通过函数调用的方式执行。这样可以减少函数调…...

如何在Ubuntu 18.04上安装PHP 7.4并搭建本地开发环境

引言 PHP是一种流行的服务器脚本语言&#xff0c;用于创建动态和交互式web页面。开始使用你选择的语言是学习编程的第一步。 本教程将指导您在Ubuntu上安装PHP 7.4&#xff0c;并通过命令行设置本地编程环境。您还将安装依赖管理器Composer&#xff0c;并通过运行脚本来测试您…...

狭义相对论

文章目录 一、为什么光速不变&#xff1f;二、为什么爱因斯坦坚信“相对性原理”三、逻辑和数学显威力&#xff0c;狭义相对论时空变换&#xff08;洛伦兹变换&#xff09;推导四、新时空变换带来的新时空观1、有关相对论时间的“傻问题”2、关于相对论的“怪问题”3、关于“双…...

仓库使用综合练习

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。 4、Dockerfile快速搭建自己专属的LAMP环境&#xff0c;生…...

如何在前端实现WebSocket发送和接收TCP消息(多线程模式)

目录 第一步&#xff1a;创建WebSocket连接第二步&#xff1a;监听WebSocket事件第三步&#xff1a;发送消息第四步&#xff1a;后端处理函数说明 当在前端实现WebSocket发送和接收TCP消息时&#xff0c;可以使用以下步骤来实现多线程模式。本文将详细介绍如何在前端实现WebSoc…...

VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库

前面说的Delphi通过Activex DLL同时调用PowerBasic和FreeBasic写的DLL&#xff0c;是在WINDOWS基础平台上完成的。 而 .NET平台是架在WINDOWS基础平台之上的&#xff0c;它的上面VB.NET或C#等开发的APP程序&#xff0c;下面写一下用VB.NET&#xff0c;通过VB6注册的Activex DLL…...

怎样不引入图片实现前端css实现x关闭按钮

首先初始化一个dom节点 <span class"closeButton"></span>设置样式 .closeButton {width: 12px;height: 12px;margin-top: 5px;margin-right: 5px;float: right;cursor: pointer;color: #105c86;}通过伪元素before after画两条线 margin-left 的设置是…...

SpringBoot实现文件下载的多种方式

SpringBoot实现文件下载的几种方式 1. 将文件以流的形式一次性读取到内存&#xff0c;通过响应输出流输出到前端1.1 下载文件 2. 将输入流中的数据循环写入到响应输出流中&#xff0c;而不是一次性读取到内存&#xff0c;通过响应输出流输出到前端3. 下载网络文件到本地4. 网络…...

Alpamayo-R1-10B实战案例:自动驾驶算法工程师日常调试VLA模型工作流

Alpamayo-R1-10B实战案例&#xff1a;自动驾驶算法工程师日常调试VLA模型工作流 1. 项目概述 Alpamayo-R1-10B是专为自动驾驶研发设计的开源视觉-语言-动作(VLA)模型&#xff0c;基于100亿参数架构构建。这套工具链包含AlpaSim模拟器和Physical AI AV数据集&#xff0c;旨在通…...

Vue3项目实战:5分钟搞定DeepSeek API对接,打造你的专属AI聊天助手

Vue3项目实战&#xff1a;5分钟搞定DeepSeek API对接&#xff0c;打造你的专属AI聊天助手 最近在重构个人博客时&#xff0c;突然想到如果能给访客加个智能问答助手应该挺酷的。作为一个长期混迹开源社区的全栈开发者&#xff0c;我习惯性先搜了圈现有方案——结果发现DeepSeek…...

告别C盘爆满!手把手教你配置Miniforge,让所有虚拟环境乖乖待在D盘

彻底解放C盘空间&#xff1a;Miniforge虚拟环境全迁移至D盘实战指南 每次打开资源管理器看到C盘飘红的存储条&#xff0c;心跳都会漏半拍——这大概是Windows开发者最熟悉的焦虑场景。特别是当你发现conda创建的虚拟环境正悄无声息吞噬着宝贵的系统盘空间时&#xff0c;那种无…...

xiaomusic设备DID配置故障排除与优化指南

xiaomusic设备DID配置故障排除与优化指南 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic xiaomusic作为一款开源的小爱音响音乐服务工具&#xff0c;让用户能够通过…...

mitmproxy实战:从环境搭建到HTTPS抓包全攻略

1. 认识mitmproxy&#xff1a;你的网络调试瑞士军刀 第一次听说mitmproxy时&#xff0c;你可能觉得这是个复杂的安全工具。但实际用过后就会发现&#xff0c;它就像网络调试领域的瑞士军刀&#xff0c;能解决各种数据抓包难题。简单来说&#xff0c;mitmproxy是个开源的交互式中…...

THE LEATHER ARCHIVE快速体验:一键生成杂志级AI皮衣大片,小白也能当设计师

THE LEATHER ARCHIVE快速体验&#xff1a;一键生成杂志级AI皮衣大片&#xff0c;小白也能当设计师 1. 项目介绍与核心价值 想象一下&#xff0c;你不需要专业的设计技能&#xff0c;就能创造出媲美时尚杂志封面的皮衣设计作品。THE LEATHER ARCHIVE正是这样一个让创意触手可及…...

为什么选择ODB++格式?Cadence与HyperLynx数据交换的最佳实践

为什么选择ODB格式&#xff1f;Cadence与HyperLynx数据交换的最佳实践 在高速PCB设计领域&#xff0c;数据格式的选择直接影响着设计到制造的整个流程效率。当工程师需要在Cadence Allegro和HyperLynx之间传递设计数据时&#xff0c;ODB正逐渐成为行业首选。这种智能数据格式不…...

嵌入式AI新篇章:Qwen3-ASR-0.6B在边缘计算设备上的部署与优化

嵌入式AI新篇章&#xff1a;Qwen3-ASR-0.6B在边缘计算设备上的部署与优化 1. 引言&#xff1a;当语音识别遇见边缘计算 想象一下&#xff0c;你对着一个巴掌大的智能音箱说话&#xff0c;它几乎在你话音落下的瞬间就理解了你的意思&#xff0c;并且完全不需要连接云端。或者&…...

【花雕学编程】Arduino BLDC 之使用互补滤波进行姿态控制的机器人

从专业工程视角来看&#xff0c;基于Arduino、使用互补滤波进行姿态控制的BLDC&#xff08;无刷直流电机&#xff09;机器人&#xff0c;是一个典型的嵌入式实时闭环控制系统。它集成了传感器数据融合、控制算法和电机驱动&#xff0c;广泛应用于对姿态稳定性有要求的场景。 1、…...

突破内容壁垒:5大核心优势解锁知识自由

突破内容壁垒&#xff1a;5大核心优势解锁知识自由 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代&#xff0c;付费墙已成为获取优质内容的主要障碍。无论是学术…...