专栏名称: 鸭哥聊Java
回复关键字:666 ,领取免费简历模板,Java面试题,Java编程视频等。本号内容涵盖Java源码,JVM源码,Dubbo源码,Spring源码,Spring Cloud微服务架构,分布式高并发架构技术,MySQL性能调优等。
目录
相关文章推荐
鸭哥聊Java  ·  面试官:说一下索引的分类有哪些? ·  昨天  
数据中心运维管理  ·  阿里巴巴官方回应“河源云计算数据中心失火”, ... ·  昨天  
数据中心运维管理  ·  数据中心日常运维解决方案 ·  2 天前  
数据分析与开发  ·  直接问懵圈,MySQL一次批量插入多少条数据 ... ·  6 天前  
51好读  ›  专栏  ›  鸭哥聊Java

面试官:说一下索引的分类有哪些?

鸭哥聊Java  · 公众号  · 数据库  · 2024-12-11 11:00

正文

今天我们来聊聊 MySQL 中的索引分类,这可是数据库优化的重中之重。作为一个资深 Java 开发工程师,我经常碰到各种关于索引的疑问。干货满满,技术点不少,记得收藏。

在 MySQL 中,索引主要可以从四个角度进行分类:数据结构、物理存储、字段特性和字段个数。这些分类不仅仅是面试时的考点,更是日常开发中优化查询性能的必修课。

首先,从数据结构的角度来看,MySQL 支持三种主要索引结构:B+Tree 索引、Hash 索引和 Full-Text 索引。

InnoDB 默认支持 B+Tree 索引,这是最常用的结构。B+Tree 是一个高度平衡的树结构,其叶子节点保存着完整的数据,查询效率高,适用于范围查询和排序操作。

-- 创建一个使用 B+Tree 索引的表
CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
ENGINE=InnoDB;

Hash 索引则适合等值查询,常用于 Memory 引擎。例如:

-- 使用 HASH 索引创建表
CREATE TABLE cache (
  id INT,
  value VARCHAR(100),
  PRIMARY KEY (id)
ENGINE=MEMORY;

Full-Text 索引常用于全文检索,适合大段文本的查询,如博客内容:

-- 使用全文索引
CREATE TABLE articles (
  id INT PRIMARY KEY,
  title VARCHAR(200),
  content TEXT,
  FULLTEXT (title, content)
);

接下来,从物理存储的角度,MySQL 索引分为聚簇索引和二级索引。聚簇索引存储实际的数据记录,InnoDB 表默认使用主键作为聚簇索引。

如果没有主键,InnoDB 会自动选择第一个非 NULL 的唯一列,或者创建一个隐式的内部 ID 列。二级索引保存的是主键值,查询时需要通过二级索引找到主键,再去主键索引中定位实际数据,这个过程称为“回表”。

-- 演示主键索引和二级索引
CREATE TABLE orders (
  order_id INT PRIMARY KEY,  -- 聚簇索引
  customer_id INT,
  amount DECIMAL(10,2),
  INDEX (customer_id)        -- 二级索引
);

字段特性来看,索引可分为主键索引、唯一索引、普通索引和前缀索引。主键索引强制唯一,且不能为空。

唯一索引也要求值唯一,但允许空值。普通索引无特殊约束,用于加速查询。前缀索引则只索引字段的前几个字符,节省存储空间,常用于长文本字段。

-- 创建不同类型的索引
CREATE TABLE products (
  product_id INT PRIMARY KEY,         -- 主键索引
  product_code VARCHAR(100),
  product_name VARCHAR(255),
  UNIQUE (product_code),              -- 唯一索引
  INDEX (product_name(10))            -- 前缀索引
);

最后,从字段个数来看,索引分为单列索引和联合索引。单列索引只针对一个字段,联合索引则针对多个字段组合。联合索引遵循“最左匹配原则”:查询从左至右依次匹配,遇到范围查询时停止匹配。

-- 创建联合索引
CREATE TABLE employees (
  emp_id INT PRIMARY KEY,
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  department_id INT,
  INDEX idx_name_department (first_name, last_name, department_id)
);

-- 查询示例(最左匹配)
SELECT * FROM employees WHERE first_name = 'John';          -- 命中索引
SELECT * FROM employees WHERE first_name = 'John' AND last_name = 'Doe'-- 命中索引
SELECT * FROM employees WHERE last_name = 'Doe';            -- 无法使用索引

最后,面试官问你:什么是联合索引?最左匹配原则是什么?

你的回答:联合索引是对多个字段组合建立的索引,在 B+Tree 中这些字段的值会被组合成一个键值对。MySQL 在查询时会按联合索引的定义顺序进行匹配。

这遵循“最左匹配原则”:查询时必须从联合索引的最左侧字段开始匹配,匹配过程从左到右依次进行,一旦遇到范围查询或缺失字段,匹配过程就会中断。

例如,对于联合索引 (a, b, c),查询 WHERE a=1 AND b=2 可以使用索引,但查询 WHERE b=2 无法命中索引。

这样解释是不是清晰多了?学会了这些,你的数据库技能又进阶了一级。还有什么数据库疑问,评论区见!

对编程、职场感兴趣的同学,可以链接我,微信:yagebug  拉你进入“程序员交流群”。
🔥鸭哥私藏精品 热门推荐🔥

鸭哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》
资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。