千家信息网

Mysql数据库的主键索引和非主键索引有什么区别

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容主要讲解"Mysql数据库的主键索引和非主键索引有什么区别",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Mysql数据库的主键索引和非主键索引有什
千家信息网最后更新 2026年10月31日Mysql数据库的主键索引和非主键索引有什么区别

本篇内容主要讲解"Mysql数据库的主键索引和非主键索引有什么区别",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Mysql数据库的主键索引和非主键索引有什么区别"吧!

目录
  • 什么是索引

  • 主键索引和普通索引的区别

  • 索引具体采用的哪种数据结构

  • InnoDB使用的B+ Tree的索引模型,那么为什么采用B+ 树?这和Hash索引比较起来有什么优缺点?

  • B+ Tree的叶子节点都可以存哪些东西?

  • 聚簇索引和非聚簇索引,在查询数据的时候有区别?

  • Index Condition Pushdown(索引下推)

  • 查询优化器

  • 关于索引的题

什么是索引

MySql官方索引的定义:索引(Index)是帮助MySql高效获取数据的数据结构,索引的目的在于提高查询效率,类比字典;实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,索引列也是要占用空间。

主键索引和普通索引的区别

1.主键索引索引着数据,然而普通索引索引着主键ID值(这是在innodb中,但是如果是myisam中,主键索引和普通索引是没有区别的都是直接索引着数据)
2.当你查询用的是where id=x 时,那只需要扫描一遍主键索引,然后拿到相应数据,但是如果是查询的普通索引的话,那么会先扫描一次普通索引,拿到主键值,然后再去扫主键索引,拿到所需要的数据,这个过程叫做回表

索引具体采用的哪种数据结构

常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树

InnoDB使用的B+ Tree的索引模型,那么为什么采用B+ 树?这和Hash索引比较起来有什么优缺点?

B+ Tree索引和Hash索引区别 哈希索引适合等值查询,但是不无法进行范围查询 哈希索引没办法利用索引完成排序 哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题

B+ Tree的叶子节点都可以存哪些东西?

在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。

聚簇索引和非聚簇索引,在查询数据的时候有区别?

聚簇索引查询会更快
因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询,这个过程称作回表。
非主键索引一定会查询多次吗?
覆盖索引也可以只查询一次,覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。 如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1 = 'keytest';的时候,就可以通过覆盖索引查询,无需回表。

Index Condition Pushdown(索引下推)

MySQL 5.6引入了索引下推优化,默认开启,使用SET optimizer_switch = 'index_condition_pushdown=off';可以将其关闭。官方文档中给的例子和解释如下: people表中(zipcode,lastname,firstname)构成一个索引

WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';

如果没有使用索引下推技术,则MySQL会通过zipcode='95054'从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断数据是否符合条件。 如果使用了索引下推技术,则MYSQL首先会返回符合zipcode='95054'的索引,然后根据lastname LIKE '%etrunia%'筛选出符合条件的索引后再返回到MySQL服务端,然后MySQL服务端基于address LIKE '%Main Street%'来判断数据是否符合条件,这样返回给MySQL服务端的索引数又会减少。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

查询优化器

一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下: 1、根据搜索条件,找出所有可能使用的索引 2、计算全表扫描的代价 3、计算使用不同索引执行查询的代价 4、对比各种执行方案的代价,找出成本最低的那一个

关于索引的题

CREATE TABLE `geek` (  `a` int(11) NOT NULL,  `b` int(11) NOT NULL,  `c` int(11) NOT NULL,  `d` int(11) NOT NULL,  PRIMARY KEY (`a`,`b`),  KEY `c` (`c`),  KEY `ca` (`c`,`a`),  KEY `cb` (`c`,`b`)) ENGINE=InnoDB;

由于历史原因,这个表需要 a、b 做联合主键。
那意味着,单独在字段 c 上创建一个索引,就已经包含了三个字段,为什么要创建"ca""cb"这两个索引?

select * from geek where c=N order by a limit 1;select * from geek where c=N order by b limit 1;

问题:这位同事的解释对吗? 哪些索引没有必要,可以删除?

答案:

(1) 主键 a,b 的聚簇索引组织顺序相当于 order by a,b ,也就是先按 a 排序,再按 b 排序,c 无序。

-a--|-b--|-c--|-d--
1 2 3 d
1 3 2 d
1 4 3 d
2 1 3 d
2 2 2 d
2 3 4 d

(2) 索引 ca 的组织是先按 c 排序,再按 a 排序,同时记录主键。

-c--|-a--|-主键部分b-- (注意,这里不是 ab,而是只有 b)
2 1 3
2 2 2
3 1 2
3 1 4
3 2 1
4 2 3

上面的这个索引ca 与索引c 的数据是一模一样的。

(3) 索引 cb 的组织是先按 c 排序,在按 b 排序,同时记录主键

-c--|-b--|-主键部分a-- (同上)
2 2 2
2 3 1
3 1 2
3 2 1
3 4 1
4 3 2

所以结论是ca可以去掉,cb保留。

到此,相信大家对"Mysql数据库的主键索引和非主键索引有什么区别"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

索引 查询 数据 普通 方案 排序 叶子 条件 节点 语句 哈希 服务 最低 成本 结构 数据库 代价 字段 效率 数据结构 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技 苏州找大状互联网科技有限公司 互联网科技有限公司经营范围 互联网和科技创新 互联网科技公司发展 北京互联网络科技有限公司 小马过河互联网科技 华中科技有哪些互联网大佬 宁波青枫互联网科技有限公司 成都互联网科技公司100强 顶级互联网科技成果有哪些 消费医药和互联网科技 呼和浩特新华互联网科技学院 米聚互联网科技南京有限公司排面 深圳互联网科技的发展 广州千川互联网科技有限公司 陕西云淼互联网科技公司 郑州欣桑互联网科技有限公司 陕西九四连强互联网科技有限公司 黑龙江互联网科技公司 天津市摩尔互联网科技 互联网下的科技发展 平安科技 互联网 互联网 科技创业 互联网科技视频 电子科技大学互联网 睿民互联网科技 华服互联网科技官网 山东大美朱楼互联网科技有限公司 杭州科技互联网公司有哪些
0