MySQL是如何选择索引的?

2.3.5. 索引选择

MySQL是如何选择索引的?

优化器决定了具体某一索引的选择,也就是常说的执行计划。而优化器的选择是基于成本(cost),哪个索引的成本越低,优先使用哪个索引。

SQL 优化器会分析所有可能的执行计划,选择成本最低的执行,这种优化器称之为:CBO(Cost-based Optimizer,基于成本的优化器)。

Cost  = Server Cost + Engine Cost= CPU Cost + IO Cost

CPU Cost 表示计算的开销,比如索引键值的比较、记录值的比较、结果集的排序……这些操作都在 Server 层完成;

IO Cost 表示引擎层 IO 的开销,MySQL 8.0 可以通过区分一张表的数据是否在内存中,分别计算读取内存 IO 开销以及读取磁盘 IO 的开销。

优化器认为一条 SQL 需要创建基于磁盘的临时表,这时的成本是最大的,索引键值的比较、记录之间的比较,其实开销是非常低的,但如果要比较的记录数非常多,则成本会变得非常大。

MySQL索引出错案例分析

索引创建在有限状态上:

B+ 树索引通常要建立在高选择性的字段或字段组合上,如性别、订单 ID、日期等,因为这样每个字段值大多并不相同。像性别这种字段只有男女两种,是低选择性的字段,因此无须在性别字段上创建索引。

在有些低选择性的列上,是有必要创建索引的。比如电商的核心业务表。

在电商业务中会有一个这样的逻辑:会定期扫描支付状态为支付中的订单,然后强制让其关闭,从而释放库存,给其他有需求的买家进行购买。一般仅为已完成、支付中、超时已关闭这几种。绝大部分都是已完成,只有绝少部分因为系统故障原因,会在 15 分钟后还没有完成订单,因此订单状态是存在数据倾斜的。

例如支付状态只有已完成、支付中、超时已关闭三种,有一百万条数据,优化器会认为每个状态占用三分之一数据,使用全表扫描,避免二级索引回表效率会更高。

然而,由于数据倾斜,订单状态为支付中的数据非常少(例如有1万条),这时根据索引的查询效率会更高。

这时可以利用 MySQL 8.0 的直方图功能,创建一个直方图,让优化器知道数据的分布,从而更好地选择执行计划。

建立索引时要注意的事:

  • 经常频繁用作查询条件的字段应酌情考虑为其创建索引。
  • 表的主外键或连表字段,必须建立索引,因为能很大程度提升连表查询的性能。
  • 建立索引的字段,一般值的区分性要足够高,这样才能提高索引的检索效率。
  • 建立索引的字段,值不应该过长,如果较长的字段要建立索引,可以选择前缀索引。
  • 建立联合索引,应当遵循最左前缀原则,将多个字段之间按优先级顺序组合。
  • 经常根据范围取值、排序、分组的字段应建立索引,因为索引有序,能加快排序时间。
  • 对于唯一索引,如果确认不会利用该字段排序,那可以将结构改为Hash结构。
  • 尽量使用联合索引代替单值索引,联合索引比多个单值索引查询效率要高。

同时,还需有些注意点:

  • 值经常会增删改的字段,不合适建立索引,因为每次改变后需维护索引结构。
  • 一个字段存在大量的重复值时,不适合建立索引,比如之前举例的性别字段。
  • 索引不能参与计算,因此经常带函数查询的字段,并不适合建立索引。
  • 建立联合索引时,一定要考虑优先级,查询频率最高的字段应当放首位。
  • 当表的数据较少,不应当建立索引,因为数据量不大时,维护索引反而开销更大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开放式运动耳机哪款好用?五款高性能值得信赖产品推荐

身为户外运动的达人,我发现开放式运动耳机简直是咱们运动时的最佳拍档,不管是跑步还是健身,开放式运动耳机最为舒适,它的妙处就在于不用塞进耳朵,这样既安全又卫生,户外动起来更放心。但市面上好坏参半&…

【半夜学习MySQL】内置函数(含日期、字符串、数学等函数常用用法介绍及示例详解)

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 日期函数字符串函数数学函数其他函数 日期函数 函数名称描述current_date()当前日期current_time()当前时间current_time()…

幻兽帕鲁Palworld服务器手动部署

目录 帕鲁官方文档手动安装steamcmd通过steamcmd安装帕鲁后端客户端连接附录:PalServer.sh的启动项附录:配置文件 帕鲁官方文档 https://tech.palworldgame.com/ 手动安装steamcmd 创建steam用户 sudo useradd -m steam sudo passwd steam下载steamc…

你写HTML的时候,会注重语义化吗?

其实说到语义化,多年前端开发经验的老手估计也不会太在意,有时候工期太紧,有时候自己疏忽,也就不那么在意了,直接DIVCSS一把梭下去了。 目录 什么是HTML 什么是HTML语义化 HTML语义化所带来的好处 我把CSS样式引入…

_pickle.UnpicklingError: STACK_GLOBAL requires str

导致这个报错的原因是我跑yolo的时候修改数据集了,里面的label.cache没有删除,咱只要删除掉缓存就行!! 我这里是已经删除掉了,所以图片里面没有,一般就是在箭头所示位置有.cache文件的

Vue3知识总结-4

Vue3知识总结-4 文章目录 Vue3知识总结-4插槽Slots渲染作用域默认内容具名插槽插槽中的数据传递具名插槽传递数据 组件声明周期声明周期示意图 组件生命周期的应用动态组件组件保持存活组件被卸载 异步组件依赖注入 插槽Slots 在某些场景中,可能想要为子组件传递一…

xxljob分片广播+多线程实现高效定时同步elasticsearch索引库

需求:为了利用elasticsearch实现高效搜索,需要将mysql中的数据查出来,再定时同步到es里,同时在同步过程中通过分片广播多线程提高同步数据的效率。 1. 添加映射 使用kibana添加映射 PUT /app_info_article {"mappings&quo…

HL7协议

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.介绍2.传输协议规范2.1. MLLP2.1.1. 数据头定义2.1.2. 转义字符集 2.2. 规范说明2.3. 消息格式说明 3.HL7结构介绍3.1. 患者建档(ADT^A28)…

人工智能领域向量化技术加速多模态大模型训练与应用

目录 前言1、TextIn文档解析技术1.1、文档解析技术1.2、目前存在的问题1.2.1、不规则的文档信息示例 1.3、合合信息的文档解析1.3.1、合合信息的TextIn文档解析技术架构1.3.2、版面分析关键技术 Layout-engine1.3.3、文档树提取关键技术 Catalog-engine1.3.4、双栏1.3.5、非对称…

计算机服务器中了locked勒索病毒怎么解决,locked勒索病毒解密恢复工具

在网络技术飞速发展的时代,通过网络开展各项工作业务成为众多企业的首选,网络也为企业的生产运营提供了极大便利,大大提升了企业办公效率,但是利用网络避免不了网络威胁的存在,数据安全问题一直是企业关心的主要话题。…

TikTok机房ip好还是住宅ip好?

住宅ip比较好,机房数据中心IP高效、低价,所以使用的人多且用处复杂,这类ip极大可能存在滥用的黑历史,通过此类ip访问tiktok,被禁止的可能性更高,更容易被拉入黑名单。所以我们推荐tiktok独享原生ip搭建节点…

CC工具箱使用指南:【界线导出Excel(一横)】

一、简介 群友定制工具。 这个工具的目的是将面要素的边界线的属性导出Excel。 给定的Excel模板如下: 结果需要输出每一段界一的起点、终点的坐标,这里以度分秒的方法表达。 每段界线的方位角以及方向,方向按16位方位角描述: …

高通QCS6490开发(六):连接使用摄像头

本文将会介绍如何在FV01开发板上连接摄像头和显示预览。 所用硬件有: 1. FV01开发板 2.Raspberry 摄像头 操作步骤如下: 通过FPC线和杜邦线将FV01板和摄像头连接起来,接线如下: 1、Camera设备连接,通过22pin转15pi…

togaf培训简介2

1.定义 2.ADM 业务下降期不要瞎折腾,上升期配合业务做一些改革? 项目交付物不能是聊天记录、PPT什么的,最起码是邮件。 3.架构内容框架 或者叫:企业统一体。 包括:企业连续性和解决方案连续性 方案和工具的解耦很大程…

【回溯】1255. 得分最高的单词集合

本文涉及知识点 回溯 力扣难道:1881 LeetCode1255. 得分最高的单词集合 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score。 请你帮忙计算玩家在单词拼写游戏…

K8s 二进制部署 上篇

一 K8S按装部署方式: ① Minikube Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特 性使用。 部署地址:https://kubernetes.io/docs/setup/minikube ② Kubeadmin Kubeadmin也是一个工…

vue网页端控制台展示独有标记

效果展示 实现步骤 1. 新建js文件 定义一个类 用于提供控制台打印日志显示样式的方法 src\libs\util.log.js class Logger {// 定义静态方法static typeColor(type "default") {let color "";switch (type) {case "default":color "#3…

后台菜单数据递归展示

后台菜单数据递归展示 效果示例图aslide.vueaslideItem.vuemenu 效果示例图 aslide.vue <script setup>import {ref} from vue;const props defineProps({isCollapse: {type: Boolean,default: false}});import AslideItem from "./aslideItem.vue"const def…

MIRO时,修改页签“采购订单参考”的数量时,金额不自动计算

MIRO 发票校验时&#xff0c;进入到如下界面&#xff0c;系统参考采购订单自动带出已经收货的金额和数量。 此时如果想要修改数量时&#xff0c;有些用户账号下&#xff0c;金额不自动计算&#xff0c;但是有些用户账号下&#xff0c;数量更改时&#xff0c;系统自动计算和建议…

穷人翻身的秘诀!2024年普通人如何创业赚钱?穷人如何逆袭翻身?普通人创业新风口?

穷人的思维有一个致命的缺陷&#xff0c;就是追求确定性&#xff0c;进而失去了可能性。而赚钱的真相实际上非常残酷。世界上能够赚钱的事情必定是不确定的&#xff0c;能够赚取巨额财富的事情更是极度不确定的。只有面对不确定性&#xff0c;才能让你把竞争对手拦在门外&#…