什么是索引

根据索引类型,可以分成主键索引和二级索引(非主键索引)


主键索引:主键索引是叶子结点保存主键渐对应行的全部数据, 在 InnoDB 中,主键索引,也被叫做聚簇索引。
二级索引(非主键索引):二级索引的叶子结点保存的是索引值和主键值,当二级索引进行查询时,需要进行回表操作。

  • select * from t_user where id=1 即主键查询方式,则只需要搜索id这棵B+树
  • select * from t_user where name=‘张三’ 即普通索引查询方式,则需要先搜索name索引树,得到id的值为3,再到id索引树搜索一次。这个过程称为回表

可以看到,基于二级索引的查询需要多扫描一颗索引数,因此,尽量使用主键查询。

什么是覆盖索引

场景:10W条数据,我要从其中查出100条不连续的数据,给你id,来查name和password进行展示,如何才能高性能的去使用?

当 SQL 语句所求查询字段 (select 列)和查询条件字段(where) 全都包含在一个索引中(联合索引), 可以直接使用索引而不需要回表,这个就是覆盖索引

联合索引

在某一列上加索引以提升相关语句查询效率,联合索引就是在多个列上加索引。

相对单列来说,就是在多个列上加索引

create table t_user (
id bigint(20) not null auto_increment ,
name varchar(255) not null,
password varchar(255) ,
index(name)
primary key (id)
)engine=innodb default character set=utf8 collate=utf8_general_ci

看个例子:

select id from user_table where name= '张三'

name 是二级索引,索引树的叶子结点存储的保存有 name 和 id 值,所以通过 name 索引树查找到 id 之后,可以直接提供查询结果,不需要回表。这个查询里 索引 name 覆盖了我们的查询需求,我们称为是覆盖索引

select password from user_table where name= '张三'

name 索引树上找到叶子结点, name = "张三“ 对应的主键 id, 通过 id 在主键树上找到满足条件的数据。

主键和索引有什么区别

主键索引

  • 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
  • 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

唯一索引

  • 唯一性索引列允许空值,而主键列不允许为空值。
  • 主键列在创建时,已经默认为非空值 + 唯一索引了。
  • 主键可以被其他表引用为外键,而唯一索引不能。
  • 一个表最多只能创建一个主键,但可以创建多个唯一索引。

主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

索引下堆
SET optimizer_switch = 'index_condition_pushdown=on';

在MySQL 5.6中 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

不使用索引下堆:

根据(username,is_del)联合索引查询所有满足名称以“张”开头的索引,然后回表查询出相应的全行数据,然后再筛选出未删除的用户数据。

每一个虚线表示一次回表操作。

使用索引下堆

InnoDB在(name,is_del)索引内部就判断了数据是否逻辑删除,对于逻辑删除的记录,直接判断并跳过

虚线表示回表,使用索引下堆,回表次数减少为 2 次。

欢迎关注公众号:程序员开发者社区

参考资料

  • https://www.cnblogs.com/Leo_wl/p/13093705.html
  • https://www.jianshu.com/p/bdc9e57ccf8b

数据库中有哪些索引?相关推荐

  1. mysql中建立索引的原则_在SQL数据库中设定索引的原则是什么?(注意是设定不是创建)...

    其实索引的好坏还和你的查询语句有关系,就是where后边的列有关.如果两者协调不好的话,同样应用索引也得不到什么好处.下边的文章希望对你有益: 索引的设计 A:尽量避免表扫描检查你的查询语句的wher ...

  2. oracle数据库中索值,Oracle数据库中的索引详解

    Oracle数据库中的索引详解以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一 ROWID的概念 存储了row在数据文 ...

  3. mysql数据库算法_数据库:MySQL索引背后的数据结构及算法原理【转】

    原文:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  4. 数据库表设计索引外键设计_关于索引的设计决策 数据库管理系统

    数据库表设计索引外键设计 Introduction: 介绍: The attributes whose values are required inequality or range conditio ...

  5. 数据库索引统计信息不一致_列存储索引增强功能–克隆数据库中的索引统计信息更新

    数据库索引统计信息不一致 SQL Server was launched in 1993 on WinNT and it completed its 25-year anniversary recen ...

  6. 达梦数据库和mysql索引引擎_达梦数据库如何建索引和使用

    一.建立索引的准则 1.1在表中插入数据后创建索引 一般情况下,在插入或装载了数据后,为表创建索引会更加有效率.如果在装载数据之前创建了一个或多个索引,那么在插入每行时DM数据库都必须更改和维护每个索 ...

  7. 数据库视图、索引、存储过程优缺点

    数据库视图.索引.存储过程优缺点 1.视图 (1).什么是视图? 视图(View)作为一种数据库对象,为用户提供了一个可以检索数据表中的数据方式.用户通过视图来浏览数据表中感兴趣的部分或全部数据,而数 ...

  8. 【MySQL 数据库】使用索引的正确方式一文学会

    文章目录 MySQL 合理使用索引 一.合理利用索引 1.普通索引的弊端 2.主键索引的陷阱 3.联合索引的矛与盾 4.前缀索引的短小精悍 5.唯一索引的快与慢 6.不要盲目加索引 7.索引失效那些事 ...

  9. Linux || 数据库事务 视图 索引

    文章目录 事务 什么是事务 事务四大特性 ACID 隔离级别 事务命令 视图 定义视图 使用视图 更新视图 索引 定义 创建索引 联合索引(复合索引) 最左原则 聚簇索引 innoDB表的聚簇索引 非 ...

最新文章

  1. JDK/Dubbo/Spring 三种 SPI 机制,谁更好?
  2. CentOS7 Apache调优之开启deflate压缩模块
  3. 架构评审方法和思路总结
  4. 003_SpringBoot整合Filter
  5. 物料编码原则有码还是无码
  6. Boost::context模块fiber的jump_mov测试程序
  7. 客户服务器结构的数据库系统,客户服务器结构的数据库的例子
  8. java三目表达式_史上最强《Java 开发手册》泰山版王者归来
  9. dbname, instance, sid
  10. Google推出免费公共域名解析DNS服务
  11. EntityFramework之DetectChanges's Secrets(三)(我为EF正名)
  12. 在线小说阅读器app
  13. Excel永远不会消亡!
  14. python网课什么平台好-这些AI课网课最具人气!不仅免费、系统,还附带链接 | 资源...
  15. 青蒿素发现者与两外籍科学家共获诺奖
  16. 深交所与庄家6次过招 中集认沽走下神坛幕后
  17. k8s节点重启后,该节点一直not ready
  18. 微型计算机显示器接口,微型计算机接口技术8-2LED显示器接口-Read.PPT
  19. Python大数据-电商产品评论情感数据分析
  20. 微信小程序覆盖map组件

热门文章

  1. iOS 如何巧妙解决“一个任务需要等待另外一个任务完成后才可以执行”的问题
  2. 像素是如何绘制到屏幕上的?
  3. sun服务器删除多余文件,Sun V440服务器下如何创建、删除及恢复硬RAID 1的方法.doc...
  4. SUN U45 B150 B2500 V240 V440 V880 V890服务器
  5. 从电脑上拆下来的旧硬盘还用作移动硬盘吗
  6. 站在阿米巴经营法视角思考技术管理实践
  7. 苹果手机关闭自动更新_苹果手机耗电快?可能和这4个设置有关,建议关闭宜早不宜迟...
  8. 子窗口控件 -windows程序设计(网易小海星的博客)
  9. vue项目debugger调试看不到源码
  10. 枚举到底是个什么鬼类型?