当前位置: 首页 > news >正文

MySQL索引操作全指南:创建、查看、优化

MySQL 索引的核心操作语法,涵盖创建、查看、删除及优化场景,附详细示例:


一、创建索引

1. 建表时创建
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,       -- 主键索引 (自动创建)username VARCHAR(50) UNIQUE,             -- 唯一索引email VARCHAR(100),age INT,city VARCHAR(20),INDEX idx_age (age),                     -- 普通单列索引INDEX idx_city_age (city, age),          -- 联合索引FULLTEXT INDEX ft_idx_email (email)      -- 全文索引 (MyISAM/InnoDB)
) ENGINE=InnoDB;
2. 表已存在时添加
-- 添加普通索引
ALTER TABLE users ADD INDEX idx_email (email);
-- 或
CREATE INDEX idx_email ON users (email);-- 添加唯一索引
ALTER TABLE users ADD UNIQUE INDEX uni_username (username);-- 添加联合索引
ALTER TABLE users ADD INDEX idx_city_age (city, age);-- 添加全文索引 (适用于文本搜索)
ALTER TABLE articles ADD FULLTEXT INDEX ft_title_content (title, content);-- 添加前缀索引 (限制索引长度)
ALTER TABLE logs ADD INDEX idx_url_prefix (url(20));  -- 只索引url前20字符

二、查看索引

-- 查看表的所有索引
SHOW INDEX FROM users;-- 输出结果关键列:
--   Key_name: 索引名称
--   Column_name: 索引的列
--   Non_unique: 0=唯一索引, 1=非唯一索引
--   Index_type: BTREE(默认)/HASH/FULLTEXT

示例输出

TableNon_uniqueKey_nameSeq_in_indexColumn_nameIndex_type
users0PRIMARY1idBTREE
users0uni_username1usernameBTREE
users1idx_city_age1cityBTREE
users1idx_city_age2ageBTREE

三、删除索引

-- 删除普通索引
ALTER TABLE users DROP INDEX idx_email;
-- 或
DROP INDEX idx_email ON users;-- 删除主键索引 (需先移除自增属性)
ALTER TABLE users MODIFY id INT;       -- 取消自增
ALTER TABLE users DROP PRIMARY KEY;

四、索引优化场景语法

1. 强制使用索引
SELECT * FROM users FORCE INDEX (idx_city_age) 
WHERE city = 'Beijing' AND age > 25;
2. 忽略索引
SELECT * FROM users IGNORE INDEX (idx_age) 
WHERE age > 30;  -- 测试无索引时的性能
3. 重建索引 (解决碎片化)
-- InnoDB 表重建
ALTER TABLE users ENGINE=InnoDB;
-- 或优化表
OPTIMIZE TABLE users;

五、常见问题处理

1. 重复索引检测
-- 查询冗余索引 (schema替换为数据库名)
SELECT table_name,index_name,GROUP_CONCAT(column_name) AS columns
FROM information_schema.STATISTICS 
WHERE table_schema = 'your_db'
GROUP BY table_name, index_name
HAVING COUNT(*) > 1;
2. 索引未生效排查
EXPLAIN SELECT * FROM users WHERE age = 30 AND city = 'Shanghai';

检查 EXPLAIN 结果

  • typeref/range → 索引生效
  • typeALL → 全表扫描 (索引失效)
  • key 列为实际使用的索引名称

六、使用规范

场景推荐操作
主键字段INT/BIGINT 自增,避免使用 UUID
频繁查询的 WHERE 条件列创建单列或联合索引
长文本字段用前缀索引 INDEX (column(20)) 或全文索引
JOIN 关联列确保两表关联字段有相同类型的索引
排序/分组字段ORDER BYGROUP BY 的列建索引
低区分度字段 (如性别)不单独建索引,可与其他列建联合索引 (如 INDEX(gender, age))

示例:完整工作流

-- 1. 创建表
CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT NOT NULL,amount DECIMAL(10,2),status TINYINT,created_at DATETIME
);-- 2. 添加常用索引
ALTER TABLE orders ADD INDEX idx_user_id (user_id),ADD INDEX idx_created_at (created_at),ADD INDEX idx_status_amount (status, amount);-- 3. 查看索引
SHOW INDEX FROM orders;-- 4. 删除冗余索引 (假设不需要按amount单独查)
DROP INDEX idx_status_amount ON orders;-- 5. 重建表优化
OPTIMIZE TABLE orders;

💡 关键提示

  • 主键 PRIMARY KEY 自动创建 聚簇索引(数据按主键物理排序)
  • 修改索引 = 删除旧索引 + 新建索引(ALTER TABLE 是原子操作)
  • 生产环境避免高峰期执行索引变更(锁表风险)
http://www.dtcms.com/a/272579.html

相关文章:

  • Debian-10编译安装Mysql-5.7.44 笔记250706
  • macOS 上安装 Miniconda + Conda-Forge
  • Jekyll + Chirpy + GitHub Pages 搭建博客
  • 如何使用Java WebSocket API实现客户端和服务器端的通信?
  • 蓝桥杯第十六届(2025)真题深度解析:思路复盘与代码实战
  • MinerU将PDF转成md文件,并分拣图片
  • Alibaba Druid主要配置
  • 图片合并pdf
  • 新手向:实现ATM模拟系统
  • TDengine 数据库建模最佳实践
  • Oracle 视图
  • Tomcat:Java Web应用的幕后英雄
  • 线性探针是什么:是一种用于探测神经网络中特定特征的工具
  • 从零开始搭建深度学习大厦系列-3.卷积神经网络基础(5-9)
  • 李宏毅(深度学习)--(2)
  • 数据库复合索引设计:为什么等值查询列应该放在范围查询列前面?
  • 区间动态规划详解
  • 【JMeter】跨线程组传递参数
  • 在Docker中运行macOS的超方便体验!
  • SpringAI×Ollama:Java生态无缝集成本地大模型实践指南
  • Redis数据库基础概述
  • 8.2.3希尔排序
  • Spring for Apache Pulsar->Reactive Support->Message Production
  • KV Cache原理详解 + 代码理解
  • 从零实现一个GPT 【React + Express】--- 【2】实现对话流和停止生成
  • Pytest之收集用例规则与运行指定用例
  • 外贸网站模板 网页设计模板网站
  • WinUI3入门17:本地文件存储LocalApplicationData在哪里
  • 【佳易王桌球棋牌计时计费软件】:从功能到实操的全方位解析,灯控器适配、会员管理多场景,软件程序操作教程详解
  • BatchNorm解决梯度消失/爆炸