1.1 什么是普通索引及其作用
想象一下在图书馆找书。没有索引的时候,你需要从第一个书架开始,一本本翻看直到找到目标。MySQL的普通索引就像图书馆的卡片目录,它能帮你快速定位到数据所在位置。
普通索引是MySQL中最基础的索引类型,使用B+树数据结构实现。它不会对数据本身施加任何约束,仅仅是为了加速查询速度而存在的辅助结构。当你在某个字段上创建普通索引后,MySQL会为该字段维护一个单独的查找结构,查询时可以直接在这个结构中进行快速定位。
我记得刚开始接触数据库时,有个查询需要5秒才能返回结果。添加普通索引后,同样的查询只需要0.1秒。这种性能提升让人印象深刻。
普通索引的主要作用就是提高数据检索效率。它特别适合那些需要频繁查询但不需要保证唯一性的字段。
1.2 普通索引与其他索引类型的区别
MySQL提供了多种索引类型,每种都有其特定用途。
普通索引和唯一索引的区别很明显。唯一索引要求所有值都是唯一的,就像身份证号码不能重复。普通索引则允许重复值存在,好比一个班级里可以有多个同名的学生。
主键索引是一种特殊的唯一索引,它不允许NULL值,并且每个表只能有一个主键。普通索引就没有这些限制,你可以在一个表上创建多个普通索引。
全文索引用于文本搜索,它关注的是关键词匹配。普通索引处理的是精确匹配或范围查询。
从存储角度来说,普通索引占用的空间相对较小,维护成本也较低。它不会像唯一索引那样需要频繁检查数据唯一性。
1.3 普通索引的适用场景分析
普通索引最适合用在哪些地方呢?
查询频繁但更新较少的字段是首选。比如用户表中的“所在城市”字段,很多查询都会基于城市进行筛选,但用户不会频繁修改城市信息。
在联合查询中经常使用的字段也值得建立普通索引。假如你经常需要根据“部门”和“入职年份”来查询员工,那么为这两个字段创建复合普通索引会很有效。
中等选择性的字段特别适合普通索引。选择性指的是不同值的数量与总记录数的比例。举个例子,性别字段只有两个可能值,建立索引意义不大。而像“出生年份”这样的字段,有几十个不同值,建立普通索引就能显著提升查询性能。
需要排序或分组的字段同样受益于普通索引。ORDER BY和GROUP BY操作都能利用索引来避免全表扫描。
我遇到过这样一个案例:一个电商平台的商品分类查询很慢。为分类ID添加普通索引后,页面加载时间从3秒降到了0.5秒。这种优化效果在实际项目中很有价值。
普通索引不是万能的。对于数据量很小的表,索引带来的收益可能抵不上维护成本。写操作频繁的表也需要谨慎使用索引,因为每次数据变更都需要更新索引结构。 CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100),
INDEX idx_username (username)
);
// 频繁执行的查询 String sql = "SELECT * FROM users WHERE username = ? AND status = ?";