百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

mysql索引基础(mysql索引的用法)

wptr33 2025-04-08 19:43 19 浏览

在日常工作中,遇到查询数据比较慢的情况,一般是数据量很大,且没用到索引,索引就像书的目录,如果没有目录,需要一页一页的查询,效率很慢。有了目录,可以快速的查找数据。

索引常见的三种模型

  • hash 表
  • 排序数组
  • 二叉查找树

hash 表是一种以键 - 值存储数据的结构,通过 key 直接直接找到对应的 vale。hash 表只适用等值查询场景,对范围查找就失效了。

排序数组支持等值查询和范围查询,在有序数组中,使用二分查找,查询的时间复杂度是 O(logn)。从查询效率来说,有序数组确实是一个很好的选择。但是需要添加或者删除数据时,为了保证数组的有序性,往中间插入的数据,需要移动数组后面的数组,而内存的分配是很耗时的过程。

二叉树查找树也叫二叉搜索树,它的特定是一个结点上左子树上所有的值都小于右子树上所有的值,可以将索引的值有序的保存在二叉树上,如下图所示。

查询的速度就是树的高度,节点每次的访问都对应这磁盘的 IO 操作,同样的数据,为了加快查询速度,需要降低树的高度,而降低树的高度,需要将二叉树转成 N 叉树。这里的 N 和mysql 查询的页的大小有关。

B+树结构

b+树的查找过程

如图所示,B+ 树是一个 N 叉树,每个节点有索引和指针。如果查找数据项28。

  • 首先会把磁盘块1加载到内存,此时发生一次IO,在内存中使用二分查找确定28在17和35之间
  • 找到磁盘1中的P2指针,通过磁盘1的P2指针指向的磁盘3加载到内存,发生第二次IO
  • 28在26和30之间,找到磁盘3的P2指针指向磁盘8,把磁盘8加载到内存中,发生第三次IO
  • 在内存中做二分查找找到28,总共三次IO

真实情况是,三层的 b+ 树可以表示上百万的数据,如果百万的数据只需要三次IO,性能将会很大的提升,没有索引,查询每条数据都需要发生一次IO,查询的效率很低。

通过分析,我们可以知道IO次数取决于b+树的高度,当数据一定时,每个磁盘的数量越大,树的高度就越小,磁盘的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度就越低,所以在选择索引字段的时候要尽量小,比如 int 4个字节要比 bigint 占8个字节少占一半。

B+树和B树的区别

  • b 树节点存储数据,b+树的节点不存储数据,只是存索引,数据都存储在叶子节点。
  • b+树叶子节点用链表串联起来,而b树没有。

创建索引的几个原则

  • 最左匹配原则,mysql 会一直向右匹配知道遇到范围查询(>、<、between、like)就停止匹配,比如a 1 and b='2' and c> 3 and d = 4 ,如果建立(a,b,c,d)顺序的索引,d是用不到索引的。如果建立(a,b,d,c)的索引都可以用到,a、b、d的顺序可以任意调整。
  • = 和 in 可以乱序,比如 a = 1 and b = 2 and c = 3 建立 (a,b,c)索引可以任意顺序,mysql 查询优化器会优化查询索引
  • 尽量选择区分度高的列作为索引,区分度指的字段的不重复性比例,比例越大,扫描的记录就越少,唯一键的区分度是1,而一些状态,性别区分度在数据量大的面前区分度就是0
  • 索引不能参与计算,保持列的干净,不能在索引列上添加函数,或者运算之类。因为b+树存储的是数据表的数据,而经过运算的数据和b+树上的数据不能做比较,导致索引失效
  • 尽量的扩展索引,不要新建索引。比如表中原来有a的索引,现在要添加b的索引,把原来的索引扩展成(a,b)的索引即可。因为没建一个索引,就需要创建一个b+树。

参考

美团-MySQL索引原理及慢查询优化 深入浅出索引(上)

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...