27 mysql 组合索引 的存储以及使用

前言

这里来看一下 mysql 中索引的 增删改查

查询在前面的系列文章中都有使用到

这里 来看一下 增删改 的相关实现

索引记录 和 数据记录 的处理方式是一致的

这里来看一下 组合索引 的相关, 以及 特性

组合索引的存储以及使用

创建数据表如下, 除了主键之外, 创建了一个 field1, field2 的一个联合索引

复制代码
CREATE TABLE `tz_test_02` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `field1` varchar(12) DEFAULT NULL,
  `field2` varchar(16) DEFAULT NULL,
  `field3` varchar(24) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_composite` (`field1`,`field2`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8

将 tz_test 的数据 抽取到 tz_test_02, 然后执行 sql, "update tz_test_02 set field3 = field1;"

执行 sql 如下, "select * from tz_test_02 where field1 = 'field33';"

扫描的记录如下, 可以看到是 走的索引

"field33" 表示的是 field1, "33" 表示的是 field2, 再之后为索引记录映射的主键记录信息

索引记录信息如下

"explpain select * from tz_test_02 where field1 = 'field33';" 结果如下

执行 sql 如下, "select * from tz_test_02 where field2 = 33;"

扫描的记录如下, 可以看到是 走的所有的记录

因为索引的存储是按照顺序存储的 field1,field2 -> id

因此, 查询 field1 的记录可以走索引, 查询 field1 + field2 的记录可以走索引

这个就是 联合索引的左前缀匹配规则的道理

"explpain select * from tz_test_02 where field2 = 33;" 结果如下

相关推荐
沪漂阿龙36 分钟前
别再让数据库“吃”脏数据了!一文讲透MySQL约束,从入门到精通
数据库·mysql
skiy1 小时前
java与mysql连接 使用mysql-connector-java连接msql
java·开发语言·mysql
杨云龙UP3 小时前
mysqldump逻辑备份文件恢复总结:全库恢复、单库恢复,一篇讲明白
linux·运维·服务器·数据库·mysql·adb
ybwycx3 小时前
mysql重置root密码(适用于5.7和8.0)
数据库·mysql·adb
色空大师4 小时前
【网站搭建实操(一)环境部署】
java·linux·数据库·mysql·网站搭建
liqianpin15 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
想唱rap6 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
yige457 小时前
【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
android·mysql·adb
星辰_mya8 小时前
InnoDB的“身体结构”:页、Buffer Pool与Redo Log的底层奥秘
数据库·mysql·spring·面试·系统架构
Rysxt_9 小时前
MySQL 触发器详解与 Navicat 实战操作指南
mysql·触发器·navicat