某个字段建立了unique索引,那么这个字段还需要建立normal类型的索引吗

博客内容显示正在找答案,但未明确具体所寻答案的相关信息。


正在找答案。。。

你提到的“索引类型 normal”,这是在数据库(尤其是 **MySQL**)中创建索引时常见的一种索引类型。下面我们详细解释它的含义、作用、使用场景,并提供代码示例和与其他索引类型的对比。 --- ## ✅ 一、“Normal索引是什么? 在 MySQL 中,`Normal` 是最常见的普通索引类型,也叫 **非唯一普通索引(Non-Unique Index)**。 ### 📌 定义: > `Normal` 类型索引是一个普通的 B+Tree 索引,允许重复值和 NULL 值,不强制唯一性。 它是最基本、最常用的索引类型,主要用于速查询性能。 --- ## 🔧 二、如何创建 Normal 索引? ### 1. 在建表时创建 ```sql CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100), INDEX idx_name (name) -- Normal 索引 ); ``` 这里的 `INDEX idx_name (name)` 就是 `Normal` 类型索引。 --- ### 2. 使用 `ALTER TABLE` 添 ```sql ALTER TABLE user ADD INDEX idx_email (email); ``` 这个索引也是 `Normal` 类型。 --- ### 3. 使用 SQL 查看索引类型 ```sql SHOW INDEX FROM user; ``` 输出结果中会看到: | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | |-------|------------|-----------|--------------|-------------|-----------|-------------|----------|--------|------|------------| | user | 1 | idx_name | 1 | name | A | 100 | NULL | NULL | YES | BTREE | - `Non_unique = 1` 表示这是一个 `Normal` 索引(非唯一) - 如果是唯一索引Unique),则 `Non_unique = 0` --- ## 🆚 三、Normal 索引 vs 其他索引类型MySQL) | 索引类型 | 是否允许重复 | 是否允许 NULL | 用途说明 | |---------|---------------|----------------|----------| | **NORMAL** | ✅ 允许 | ✅ 允许 | 普通速查询,如 `WHERE name = '张三'` | | UNIQUE | ❌ 不允许重复(NULL 可多个) | ✅ 允许多个 NULL(仅 InnoDB) | 保证字段唯一性,如身份证号 | | PRIMARY KEY | ❌ 不允许重复 | ❌ 不允许 NULL | 主键,每表只能一个 | | FULLTEXT | ✅ 允许 | ✅ 允许 | 用于全文检索,适合文本搜索 | | SPATIAL | 特殊处理 | 通常不允许 NULL | 用于地理空间数据(GIS) | > 💡 所有这些索引底层默认都是 `BTREE` 实现(除非指定 `HASH` 或其他结构)。 --- ## ✅ 四、适用场景(何时用 Normal 索引?) | 场景 | 是否推荐使用 Normal 索引 | |------|----------------------------| | 查询频繁但不要求唯一性的字段(如:`status`, `category`, `user_name`) | ✅ 推荐 | | 经常出现在 `WHERE`, `JOIN`, `ORDER BY` 中的列 | ✅ 推荐 | | 需要提高查询速度且数据有重复值 | ✅ 推荐 | | 要求字段不能重复(如手机号) | ❌ 应使用 `UNIQUE` 或主键 | --- ## ⚠️ 五、注意事项 1. **不要滥用索引** 每个 Normal 索引都会增写操作(INSERT/UPDATE/DELETE)的开销,并占用磁盘空间。 2. **复合索引注意最左前缀原则** ```sql ALTER TABLE user ADD INDEX idx_name_age (name, age); ``` - ✅ 能命中:`WHERE name = '张三' AND age = 25` - ✅ 能命中:`WHERE name = '张三'` - ❌ 不能命中:`WHERE age = 25`(跳过了 `name`) 3. **避免对低基数字段Normal 索引** 比如:性别(只有男/女)、是否删除(0/1),这种字段选择性差,索引效果不佳。 4. **NULL 值不影响 Normal 索引使用** MySQLNormal 索引可以包含 NULL 值,查询 `IS NULL` 或具体值都能走索引。 --- ## ✅ 六、实际案例演示 假设有一个订单表: ```sql CREATE TABLE orders ( id BIGINT AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(50), customer_id INT, status TINYINT, -- 1:待付款, 2:已发货, 3:已完成 create_time DATETIME, INDEX idx_customer (customer_id), -- Normal 索引 INDEX idx_status (status), -- Normal 索引 INDEX idx_create_time (create_time) -- Normal 索引 ); ``` 执行查询: ```sql -- 这些查询都可以利用上面的 Normal 索引 SELECT * FROM orders WHERE customer_id = 1001; SELECT * FROM orders WHERE status = 2; SELECT * FROM orders WHERE create_time > '2024-09-01'; ``` --- ## ✅ 七、查看执行计划确认索引生效 使用 `EXPLAIN` 检查是否命中索引: ```sql EXPLAIN SELECT * FROM orders WHERE customer_id = 1001; ``` 关注输出中的: - `type`: 最好是 `ref` 或 `range` - `key`: 显示使用的索引名(如 `idx_customer`) - `Extra`: 避免出现 `Using filesort`, `Using temporary` --- ## ✅ 总结 | 项目 | 内容 | |------|------| | 名称 | Normal Index(普通索引) | | 是否唯一 | 否 | | 是否允许 NULL | 是 | | 是否可重复 | 是 | | 底层结构 | 默认为 B+Tree | | 创建方式 | `INDEX idx_name (col)` 或 `ADD INDEX` | | 适用场景 | 速查询、非唯一字段、高频查询列 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值