首页 > 数据库 >MySQL索引开发中可能会用到的知识总结

MySQL索引开发中可能会用到的知识总结

时间:2022-11-06 00:14:17浏览次数:50  
标签:用到 节点 索引 key MySQL 查询 where 主键


索引

 

适合建立索引

  • 建立索引之后,在B+树中的记录是排序好的,所以频繁使用order by和group的字段可以建立索引,

  • 同时唯一性限制的字段也适合建立索引,比如商品编码

  • 经常用where查询条件的字段

 

不适合建立索引

  • 频繁修改的字段,为了维护B+树的有序性,需要频繁的重建索引,比如余额

  • 表数据太少

  • where,group by,order by中用不到的字段

 

 

创建表时的的默认操作

在创建表时,innoDB

  • 有主键,默认使用主键作为聚簇索引的key

  • 如果没有主键,选择第一个不含NULL的唯一列作为聚簇索引的key

  • 上面都没有,自动生成一个隐式自增id列作为聚簇索引的key

 

其他索引都属于 二级索引和非聚簇索引

创建的主键索引和二级索引默认使用B+树

 

主键索引

 

二级索引,叶子节点除了key值,存储的是主键值,通过查询主键,再去查询某行的数据,这个过程叫 回表,也就是说要差两个B+树才能查到数据

 

B+树和B树的比较

  • B树的非叶子节点也要存储数据,B+树只在叶子节点存储数据,所以B+树的高度更低,一个内部节点可以定位更多的叶子节点

  • b+树的叶子节点是双链表连接,适合MySQL中常见的基于范围查找

  • B+树叶子节点位于同一行,查找时间稳定

 

 

索引的分类

  • 从数据结构的角度有B+,hash索引,full-text索引

  • 从物理存储分类,有聚簇索引(主键索引)和二级索引(辅助索引)

  • 从字段特性分类:主键索引(primary key),唯一索引(unique key),普通索引(index),前缀索引(也是index,针对字符类型字段前几个字符建立索 引,目的是为了减少索引占用的存储空间)

  • 从字段个数分类:单列索引(如主键索引),联合索引(多个字段组合成一个索引)

 

 

索引的优化

  • 前缀索引优化

    • 使用某个字符串前几个字符建立索引,减小索引大小

    • 有一定局限性,order by无法使用前缀索引(索引失效)

  • 覆盖索引优化

    • 主要是避免回表

    • 比如要查询商品名称,价格,可以以[id,name,price]作为一个联合索引,查询的时候索引中存在这些数据,查询将不会再次检索主键索引,从而避免回表

 

索引失效

  • like %x或者%xx%这种,不知道从哪个索引值开始比较,所以只能进行全表扫描

  • 对索引列做了数据处理(计算,函数,类型转换),索引保存的是索引字段的原始值,而不是表达式计算之后的值,无法查询索引

    • 类型转换比如 where phone=130000001(phone是varchar类型)

  • 联合索引最左匹配(因为联合索引是先排a,a相同的行再排b),下面两种都会失效

    • where a>1 and b>1

    • where b=2

  • where子句中or有非索引列字段,因为只要满足就可以查到,所以只查索引是肯定找不齐的,所以要查全表

  •  

标签:用到,节点,索引,key,MySQL,查询,where,主键
From: https://www.cnblogs.com/mumayiren/p/16861754.html

相关文章

  • MySQL表加字段可为null导致ArrayIndexOutOfBoundsException报错问题记录
    问题爆出企微群告警爆了,立即去看ELK报错日志,报错日志非常莫名其妙:​​java.lang.ArrayIndexOutOfBoundsException:16​​原因分析事后发现共有18257次报错日志,时间跨度19:......
  • MySQL read_ only Read Only Attribute Description
    一、MySQLread_onlyReadOnlyAttributeDescription在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-Slave主从关系设置,以下针对rea......
  • # MySQL Server 5.7下的拉丁文编码如何改为中文编码问题
    问题出现MySQL版本问题解决问题找到my.ini文件进入修改编码加入:default-character-set=utf8#默认字符集(63行左右)加入:character-set-server=utf8collation-......
  • MongoDB基础之索引分析
    目录1索引1.1定义1.2创建索引1.3查看删除索引1.4查询分析1.4.1索引分析explain1.4.2强制使用索引hint1.5嵌套索引1.5.1索引数组字段1.5.2索引子文档字段1.6全......
  • docker实战教程(十四):docker上安装mysql
    dockerhub上查找mysql镜像dockersearchmysql从dockerhub上拉取mysql镜像到本地(指定版本为5.7)dockerpullmysql:5.7使用mysql5.7镜像创建容器(也叫运行镜像)......
  • MySql如何不插入重复数据
    向数据库的插入值时,需要判断插入是否重复,然后插入。这种操作怎么提高效率下面说说一些解决方案1、insertignoreinto当插入数据时,如出现错误时,如重复数据,将不返回错......
  • mysql 8系备份学习总结
    一、背景:1、 PerconaXtrabackup8.0.25不支持低于MySQL8.0的备份(因为MySQL8.0在数据字典、redolog中和之前版本不兼容),因此2.4版本的也不支持8系的备份     ......
  • 解决在idea中使用springMvc向mysql写入中文数据乱码
    相关设置:1、idea编码格式设置:   2、MySQL的相关编码格式设置:修改前编码:无用操作:之前通过命令行修改编码格式:setcharacter_set_client=utf8......
  • Centos7安装MySQL
    一、卸载系统自带的mariadb1、查看系统自带的mariadbrpm-qa|grepmariadb   2、卸载rpm-e--nodeps mariadb-libs-5.5.68-1.el7.x86_64二、mysql安装1、......
  • MySQL高级3【性能分析工具-索引优化-查询优化】尚硅谷
    第09章性能分析工具的使用1.数据库服务器的优化步骤当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。整个流程划分成了观察(Showstat......