聚集索引和非聚集索引

数据库中B+树索引可以分为聚集索引和非聚集索引(辅助索引)

聚集索引

每张表只有一个聚集索引,且是建立在主键上面的。

主键索引

在InnoDB存储引擎中,每张表都有个主键,如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按如下方式选择或创建主键

首先判断表中是否存在非空的唯一索引,如果有,则该列即为主键
如果不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针。

联合索引

联合索引在表上的多个列进行索引。

1.联合索引

创建如下的表,并创建一个联合索引(a,b)

CREATE TABLE t(
a INT,
b INT,
PRIMARY KEY (a),
KEY idx_a_b (a,b)
)ENGINE=INNODB

联合索引的B+树如下。通过叶子节点可以逻辑上顺序的读出所有数据,(1,1),(1,2),(2,1),(2,4),(3,1),(3,2)

2.能够使用联合索引的情况

①全匹配

select * from t where a=xxx and b=xxx

②最左前缀匹配

对于单个的a列,也可以用到(a,b)联合索引

select * from t where a=xxx

③不能使用联合索引

叶子节点上b的值为1,2,1,4,1,2,显然不是排序的。

select * from t where b=xxx

同理,如果建立(a,b,c)索引,则下面的查询都能用到索引。

select * from t where a=xxx and b=xxx and c=xxx
select * from t where a=xxx and b=xxx
select * from t where a=xxx
select * from t where b=xxx and c=xxx

3.联合索引可对第二个列进行排序处理,减少一次filesort。

在联合索引(a,b)中,由于a相同的情况下b本来就是排序的,所以下面的查询能够用到(a,b)索引,且不需要额外再进行排序。

select * from t where a=xxx order by b

同理,如果建立(a,b,c)索引,下面的查询也能少一次fileSort。

select * from t where a=xxx and b=xxx order by c
select * from t where b=xxx order by c
select * from t where a=xxx order by b

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群(374308445)来交流学习,里面都是同行,群验证【CSDN2】有资源共享。

联合索引(各种索引)相关推荐

  1. mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖

    一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...

  2. mysql索引篇之覆盖索引、联合索引、索引下推

    覆盖索引 在之前<mysql索引初识>这篇文章中提到过,mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即 ...

  3. MySQL 性能分析 之 联合索引(复合索引)实践分析

    MySQL 性能分析 之 联合索引(复合索引)实践分析 作为开发者,大家都知道,一个服务器.一个数据库的性能是项目的重中之重,后台架构.写法与数据库设计的好坏往往直接影响到整个项目的性能. 索引:是当 ...

  4. MySQL联合索引以及索引顺序优化

    MySQL联合索引以及索引顺序优化 1. 环境准备 2. 测试验证 1. 环境准备 -- 查看版本 ,5.7.19-17-log select VERSION();-- 创建表结构 CREATE TA ...

  5. mysql联合索引和索引优化的理解

    首先介绍联合索引的最左原则,即假设某张表test,有四个字段,id,a,b,c:id是主键,a和b是联合索引,建表和值如下: CREATE TABLE `test` (`id` int(11) NOT ...

  6. 复合索引 /多列索引 /联合索引 /组合索引?????

    复合索引 /多列索引 /联合索引 /组合索引,一个意思,不同叫法. 含有多个列字段的索引 联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2. 例如: 创建数据库表CREATE ...

  7. 【推荐】mysql联合 索引(复合索引)的探讨

    Mysql联合 索引(复合索引)的使用原则 命名规则:表名_字段名 需要加索引的字段,要在where条件中. 数据量少的字段不需要加索引.最窄的字段放在键的左边. 如果where条件中是OR关系,必须 ...

  8. Mysql的联合查询的索引小结

    1.顺带提一下mysql的sql执行顺序: FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition& ...

  9. 联合两个索引查询,已解决: 还有个进行多条件搜索 and 与 or 的操作

    1 联合两个索引查询,已解决: IndexSearcher[] searchers = new IndexSearcher[2]; searchers[0] = new IndexSearcher(m ...

  10. mysql索引创建规则、联合与一般索引、执行计划、索引选择,索引重建与下推

    数据库索引怎么建,什么时候用到 索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树. 建 ...

最新文章

  1. Asp.Net大型项目实践(7)-用Unity实现AOP之事务处理+为啥要用AOP(附源码)
  2. 基于地图的工作流设计器,及基于地图的业务流程办理界面(三)
  3. InstallSield更新包快速入门文档----感谢原作者ㄣ齊¨彡仯乄的无私提供
  4. python D29 socketserver以及FTB
  5. 《Pytorch - 线性回归模型》
  6. PyQt5: This application failed to start because it could not find or load the Qt platform plugin
  7. 总结div里面水平垂直居中的实现方法
  8. 腾讯悄悄发布 Linux QQ,版本 2.0 Beta
  9. 破解 找回 lockdir 加密的文件
  10. linux 图片转视频教程,如何在Ubuntu上转换图像、音频和视频格式
  11. 第五章:软件详细设计
  12. 什么是悬赏任务APP源码?
  13. 【Uniapp 原生插件】芯烨云打印机插件
  14. Unity3d打包程序报错NotSupportedException: Encoding 437 data could not be found.
  15. 物联网的新危机!即将到期的SSL证书可能会影响……
  16. 如何制作一个自己的四足机器人
  17. windows在此计算机上找不到系统映象,笔记本电脑没有系统映像怎么办
  18. D:\anaconda3\envs\py2\python.exe: can‘t open file ‘create‘: [Errno 2] No such file or directory
  19. linux 的常用命令(持续更新.....)
  20. 计算机站课作文400字,关于电脑教室的作文400字

热门文章

  1. 移动通信电波传播及损耗(二)
  2. Coursera-Python for everybody
  3. 统计学中基础概念说明
  4. C语言单链表 看不懂temp->next = book; book->next =NULL;
  5. 微信小程序加密 MD5
  6. 关于脚本录制和回放终端会话(script、scriptreplay)使用
  7. phpStudy环境变量
  8. Inventor 2021 安装避坑指南
  9. CSS3 3D变换--扑克牌翻转
  10. python2.7开发photoshop一些经验