MySQL第一讲:MySQL索引规范

2023-11-15

索引(Index)是帮助MySQL高效获取数据的数据结构。数据库系统维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

1、类型(三种)

主键索引名为 pk_字段名; 唯一索引名为 uk_字段名; 普通索引名则为 idx_字段名 。
说明: pk_ 即 primary key; uk_ 即 unique key

2、规范(10余条)

序号 规范 说明 例子
1 【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引 不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明 显的; 另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生 节能环保打标表 UNIQUE INDEX uk_config_brand_spec_auth(config_id, brand_id, specification(255), auth_code(255)) USING BTREE, 区划限价设置表(牧谦) CREATE UNIQUE INDEX uni_district ON db_item.zcy_district_category_price (category_id,config_id,district_id);
2 【强制】超过三个表禁止 join。 需要 join 的字段,数据类型必须绝对一致; 多表关联查询时,保证被关联的字段需要有索引。 即使双表 join 也要注意表索引、 SQL 性能。 商品库不存在join
3 【强制】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可 索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为 20 的索引,区分度会高达 90%以上,可以使用 count(distinct left(列名, 索引长度))/count(*)的区分度来确定 属性值表 create index idx_name on db_item.parana_property_value (name(100))
4 【强制】页面搜索严禁左模糊或者全模糊,如果需要请走搜索引擎来解决。 索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索引 属性值表 INDEX idx_name(name(20)) USING BTREE SQL:AND name LIKE CONCAT(#{name},‘%’)
5 【推荐】如果有 order by的场景,请注意利用索引的有序性。 order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort(文件排序)的情况,影响查询性能。 正例: where a=? and b=? order by c; 索引: a_b_c 反例: 索引中有范围查找,那么索引有序性无法利用,如: WHERE a>10 ORDER BY b; 索引a_b 无法排序。 spu库(奕铭):IDX_category_status_createdAt(category_id,status,created_at) sql:WHERE category_id = 4619 and status = 3 order by created_at DESC LIMIT 0, 500
6 【推荐】利用覆盖索引来进行查询操作,避免回表。覆盖索引: 如果一本书需要知道第 11 章是什么标题,会翻开第 11 章对应的那一页吗?目录浏览一下就好,这个目录就是起到覆盖索引的作用。 能够建立索引的种类分为主键索引、唯一索引、普通索引三种,而覆盖索引只是一种查询的一种效果,用 explain 的结果, extra 列会出现: using index。
7 【推荐】利用延迟关联或者子查询优化超多分页场景。 MySQL 并不是跳过 offset 行,而是取 offset+N 行,然后返回放弃前 offset 行,返回N 行,那当 offset 特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行 SQL 改写 先快速定位需要获取的 id 段,然后再关联:SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
8 【推荐】 SQL 性能优化的目标:至少要达到 range 级别, 要求是 ref 级别, 如果可以是consts最好 1) consts 单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。2) ref 指的是使用普通的索引(normal index) 。3) range 对索引进行范围检索 反例:explain 表的结果, type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫
9 【推荐】建组合索引的时候,区分度最高的在最左边。 存在非等号和等号混合时,在建索引时,请把等号条件的列前置。如: where c>? and d=? 那么即使 c 的区分度更高,也必须把 d 放在索引的最前列, 即索引 idx_d_c。 如果 where a=? and b=? ,如果 a 列的几乎接近于唯一值,那么只需要单建 idx_a索引即可。5.7提供自动顺序优化**
10 【推荐】 防止因字段类型不同造成的隐式转换, 导致索引失效 例子:
11 【参考】创建索引时避免有如下极端误解 1) 宁滥勿缺。 认为一个查询就需要建一个索引。 2) 宁缺勿滥。 认为索引会消耗空间、严重拖慢更新和新增速度。 3) 抵制惟一索引。 认为业务的惟一性一律需要在应用层通过“先查后插”方式解决 唯一索引踩坑:

CheckList

Action1 、三个字段联合索引时,如果中间的字段使用了范围查询或者模糊查询,最后一个字段还会用到索引么?

用得到

Action2、在order by时,索引是如何使用的?

使用了 filesort 模式

Action3、新建一张表,如何界定其索引的数量,有没有选择或者公式

根据业务场景选择,不要遗漏索引,索引也不是越多越好

Action4、字符串如何加索引,能不能再详细介绍下字符串前缀索引

使用某个字段中字符串的前几个字符建立索引。
前缀索引优化为什么需要优化?索引文件是存储在磁盘中的,而磁盘中最小分配单元是页,通常一个页的默认大小为 16KB,减小索引字段大小,可以增加一个页中存储的索引项,有效提高索引的查询速度

Action5、什么是覆盖索引?

select ID from T where k between 3 and 5,这时只需要查ID的值,而ID的值已经在k索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引k已经“覆盖了”我们的查询需求,我们称为覆盖索引
具体见这篇文章:MySQL第二讲:MySQL索引原理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL第一讲:MySQL索引规范 的相关文章

  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List

随机推荐

  • Minikube安装以及一些踩坑的解决

    安装k8s和docker 我的测试系统是centos7 8的国内服务器 参考文档 https developer aliyun com article 221687 首先先安装k8s 1 19 2版本 1 19 x 版本的安装 腾讯云 do
  • vue.config.js详解

    vue config js 是一个可选的配置文件 如果项目的 和 package json 同级的 根目录中存在这个文件 那么它会被 vue cli service 自动加载 配置项详情见 配置参考 Vue CLI use strict i
  • Swift open public等修饰符详解

    swift 中关于open public internal fileprivate private 修饰的说明 open 用open修饰的类可以在本某块 sdk 或者其他引入本模块的 sdk module 继承 如果是修饰属性的话可以被此模
  • foxpro被什么软件取代_MATLAB可以被取代么?可以被什么软件取代?

    有很多关于MATLAB是否可以被取代 以及可以被什么软件取代的讨论 这里抛砖引玉 简单讨论一下 首先需要明晰一点 就是 当我们在说取代时 是只取代MATLAB的部分功能 优化 数据分析 深度学习 仿真 还是全部功能 MATLAB编程语言 领
  • 第五章:认证和动态菜单功能【基于Servlet+JSP的图书管理系统】

    一 登录功能 1 认证实现 53 图书管理系统 登录功能 认证处理 首先完成最基础的登录功能 也就是在登录页面通过表单提交账号和密码到Servlet中 做相关的校验 给出不同的反应 然后对应的Servlet中的处理逻辑 WebServlet
  • 机器学习笔记 - 使用具有triplet loss的孪生网络进行图像相似度估计

    一 简述 孪生网络是一种网络架构 包含两个或多个相同的子网络 用于为每个输入生成特征向量并进行比较 孪生网络可以应用于不同的场景 例如检测重复项 发现异常和人脸识别 此示例使用具有三个相同子网的孪生网络 我们将向模型提供三张图像 其中两张是
  • 【毕业设计_课程设计】基于Flutter的聊天社交应用

    文章目录 0 项目说明 1 开发环境 3 界面效果图 4 项目源码 0 项目说明 基于Flutter的聊天社交应用 提示 适合用于课程设计或毕业设计 工作量达标 源码开放 FYim flutter yim 是基于 Flutter 技术开发的
  • Opencv-C++笔记 (2) : opencv的矩阵操作

    文章目录 创建与初始化 1 1 数据类型 1 2 基本方法 1 3 初始化方法 矩阵加减法 矩阵乘法 矩阵转置 矩阵求逆 矩阵非零元素个数 矩阵均值与标准差 矩阵全局极值及位置 GEMM 通用矩阵乘法 Transform 对数组每一个元素执
  • 一些for循环的变种

    for循环的判断部分省略会意味着判断会很成立 会一直进行下去 当我们在for循环中不添加上任何条件 for printf hehe n return 0 该串代码会将hehe死循环输出 当我们把for循环只省略掉第一个表达式 include
  • 收获 2020-6-12

    一个讲解GitHub很详细的操作博文
  • win环境,electron打包时,内存溢出的解决方案

    针对electron打包时内存溢出 打包过程报如下错误 解决方案1 退出了360安全卫士等杀毒软件后 一切症状全部消除 顺利打包成功 解决方案2 在package json中添加如下代码 build node max old space s
  • Android 之菜单(Menu)

    本节引言 本章给大家带来的是Android中的Menu 菜单 而在Android中的菜单有如下几种 OptionMenu 选项菜单 android中最常见的菜单 通过Menu键来调用 SubMenu 子菜单 android中点击子菜单将弹出
  • python---pyecharts数据可视化(条形图、散点图、涟漪图、折线图、K线图、饼图、圆环图、玫瑰图、漏斗图)

    条形图 Bar 散点图 Scanner 涟漪图 EffectScatter 折线图 Line K线图 Kline 饼图 Pie 圆环图 Pie 玫瑰图 Pie 漏斗图 Funnel 1 条形图 from pyecharts charts i
  • 28BYJ-48单极性步进电机

    转自太极创客 28BYJ 48单极性步进电机http www taichi maker com homepage reference index motor reference index 28byj 48 stepper motor in
  • 跟我一起写 Makefile(十一)

    跟我一起写 Makefile 十一 本文来自于CSDN 陈皓博主 网址http blog csdn net haoel article details 2896 详细内容请参考其经典文章 跟我一起写makefile 陈皓
  • 强化学习之一:从TensorFlow开始(Start from TensorFlow)

    本文是对Tensorflow官方教程的个人 tomqianmaple outlook com 中文翻译 供大家学习参考 官方教程链接 纯属自愿翻译 只为学习与分享知识 所以如果本系列教程对你有帮助 麻烦不吝在github的项目上点个star
  • C++万能头文件(真心佩服!)

    include
  • mysql初始化报错:[ERROR] --initialize specified but the data directory has files in it. Aborting.

    执行命令 mysqld initialize user mysql报错如下 原因是你已经进行了数据库初始化因为mysql在进行初始化的时候已经自动创建了一个root用户 1找到配置文件的数据目录 root server4 mysql vim
  • MATLAB 支持向量机(SVM)

    MATLAB 支持向量机 SVM 详细解释 含代码 基础 线性可分 最大间隔超平面 SVM分类 基本代码和工具 二分类 线性 非线性 多分类 详细解释 基础 线性可分 简单来讲就是如何将两个数据用点 直线 平面分开 二维空间中 要分开两个线
  • MySQL第一讲:MySQL索引规范

    索引 Index 是帮助MySQL高效获取数据的数据结构 数据库系统维护着满足特定查找算法的数据结构 这些数据结构以某种方式引用 指向 数据 这样就可以在这些数据结构上实现高级查找算法 这种数据结构 就是索引 文章目录 1 类型 三种 2