mysql索引问题

今天在工作写项目的时候,突然发现很多地方没有加索引,然后我就去加了,查了不少资料,捡起来了不少东西,来简单聊一聊,工作中最重要的一个细节:索引

mysq的存储结构

首先要聊一聊mysql的存储模式,底层使用B+树存储,它和B-(B树,多叉树)区别就是,B+树的叶子节点是相连的(双向连表)

你们刚开始一定在想,为啥要怎么干,因为mysql只会在叶子结点存储数据,也就是说,路径上都只是拿来保存路径的,用来方便查询叶子结点。

所以用B-树查询太慢了,最快也是OlogN(它是一个N叉搜索树),B+树叶子结点可以左右查询,就不需要返回上一级,然后再查询另一叶子节点。

mysql索引结构:

上面既然说了是用的B+树作为mysql的存储结构,那么它的索引肯定也是使用B+树来存储的

索引的定义就是拿来加快查询的,如何加快,就得提到算法一个词语:

空间换时间

就像java中的使用Map存储一样,直接用key去查询value,思想是一样的。(HashMap底层也是树结构哦,小老弟!)

mysql中的索引

1、聚簇索引(主键)

        它叶子结点就存放了主键值(很明显叶子节点是一个对象,类似有一个key和一个data,key存放的就是主键值),另一个区域存的除开主键后的所有数据。

2、辅助索引(普通索引,二级索引):

        而辅助索引存放的是索引字段值,主键值。

索引的使用

3、回表

这里如果我们这样查询:

select age from user where name='小李'

由于我们用的是辅助索引,先查辅助索引树,发现只有name,没有age,所以这个时候就得去查主键索引树(回表),又要遍历一次主键索引树。

这里就能解答我的一个疑问:

为什么不直接一个字段一个索引,而是用组合索引(多个字段),字段太少就会回表查询,除非那种单独的使用,例如我就要通过name来查询,我就只能大度给name加一个索引,然后指定使用:

use index

select * from usera use index(nameindex) where user.name='小白'

所以使用select *就会回表查询,因为没有索引有全部字段。

4、最左前缀法则:

既然是用B+树,它的叶子节点就是一个从左往右的,所以创建索引的时候,也是按照指定的顺序的。

那么我们在使用索引时,也会从左往右查询,挨个挨个命中索引,

所以我们使用索引时,必须按照创建时的顺序,从左往右使用,但凡中间少了一个,就不会使用索引。顺序可以打乱,mysql会优化掉。

5、索引下推

没有使用索引下推

使用了索引下推:

很明显,就是提前判断了辅助索索引中有的字段,提前过滤掉,减少回表判断的次数。

 来首打油诗:

                            全值匹配我最爱,最左前缀要遵守
                            带头大哥不能死,中间兄弟不能断
                            索引列上少计算,范围之后全失效
                            like百分写最右,覆盖索引不写星
                            不等空值还有or,索引失效要少用

mysql的两个数据库引擎 MYIASM和InnoDB 

MYIASM的存储结构长这样:

也就是主键索引就是一个文件。另外一个是data文件。叶子结点对应数据在data文件里的地址。

 而InnoDB是这样的:

叶子结点存放数据,所以呢,主键索引和数据是存放在一块的,所以它必须要有主键,没有指定mysql会自己生成一个。

 

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

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

相关文章

Docker镜像和容器

1.Docker的架构和底层技术 Docker提供了一个开发、打包、运行APP(应用application)的平台把APP和底层infrastructure(基础设备)隔离开来 ApplicationDocker EngineInfrastructure(physical/virtual) 1.1Docker Engine组成 后台…

【前端素材】推荐优质后台管理系统GramOs平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具,它通常作为一个独立的后台界面存在,供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能: 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Imagewheel私人图床搭建结合内网穿透实现无公网IP远程访问教程

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

工具篇-- 定时任务quartz

文章目录 前言一、quartz 介绍:二、quartz 的简单使用:2.1 引入jar:2.2 定义任务: 三、quartz 核心组件:3.1 JobDetail:3.1.1 JobDetail介绍:3.1.2 JobDetail 和job 的关系: 3.2 trigger:3.2.1 trigger 介绍…

基于Spring Boot的安康旅游网站的设计与实现,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1760645517548793858

【动态规划专栏】专题四:子数组问题--------最大子数组和环形子数组的最大和

本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小…

现货黄金中短线投资该怎么做?

要明确什么是现货黄金的中短线投资,中短线投资是指在短期内(一般为几天至几周)对现货黄金进行买卖操作,以期获得收益的投资方式。相较于长线投资,中短线投资的风险相对较大,但同时收益也更为可观。那么&…

【TCP/IP】内核网络堆栈

在Linux内核中,网络堆栈(network stack)是一套实现网络通信功能的软件包,负责处理数据包的发送和接收。网络堆栈按照OSI模型(开放式系统互联通信参考模型)或TCP/IP模型的层次结构来组织,实现了从…

数据结构2.22

思维导图顺序表(按位置插入、按位置删除和去重) //main.c #include "seq_list.h" int main() {seq_p L create_seq_list();insert_head(L,23);insert_head(L,20);insert_head(L,9);insert_head(L,20);insert_head(L,20);insert_head(L,6);insert_pos(L,321,2);inser…

2024牛客寒假算法基础集训营3 -BDGH

B题 :智乃的数字手串 思路: 思维题,本题题意N个数组首尾相连,然后当某两个相邻数组和为偶数时,交替拿走,并在选择两个数字交换位置,直到没有可以操作的数字为止。 我们可以考虑,数字…

016—pandas 分析近100年圣诞节日期分布

需求: 利用Pandas 分析近100年圣诞节的星期分布,目的是知道圣诞节都在星期几,哪个星期多些。 思路: 用 pd.date_range 生成 100 年日期数据 筛选出12月25日的所有日期 将日期转换为星期几 统计重复值的数量 绘图 二、…

LeetCode 热题 100 Day01

哈希模块 哈希结构: 哈希结构,即hash table,哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素,有两种方法: 1.从头遍历,复杂度&#xf…