当前位置: 首页 > 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.lryc.cn/news/584717.html

相关文章:

  • H5微应用四端调试工具—网页版:深入解析与使用指南
  • 7月10号总结 (1)
  • C++ Lambda 表达式详解
  • 数据结构 顺序表(1)
  • linux-MySQL的安装
  • [数据结构与算法] 优先队列 | 最小堆 C++
  • 7-语言模型
  • 数据仓库:企业数据管理的核心枢纽
  • 基于模糊控制及BP神经网络开关磁阻电机的matlab仿真
  • 量子计算系统软件:让“脆弱”的量子计算机真正可用
  • 《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
  • Three.js+Shader实现三维波动粒子幕特效
  • 1.1.1数据类型与变量——AI教你学Django
  • SQLite3 中列(变量)的特殊属性
  • 【c++八股文】Day6:using和typedef
  • MiniGPT4源码拆解——models
  • vscode和插件用法
  • imx6ull-裸机学习实验17——SPI 实验
  • 【会员专享数据】2013-2024年我国省市县三级逐年SO₂数值数据(Shp/Excel格式)
  • Jaspersoft Studio-6.4.0 TextField内容展示不全
  • 【大模型推理论文阅读】 Thinking Tokens are Information Peaks in LLM Reasoning
  • 设计模式的六大设计原则
  • vue3 element plus table 使用固定列,滑动滚动会错位、固定列层级异常、滑动后固定列的内容看不到了
  • 二刷 黑马点评 短信登陆功能
  • MatrixOne Intelligence v3.3 正式发布:结构化、自动化、可视化三重进化
  • 告别繁琐:API全生命周期管理的新范式——apiSQL
  • Android 网络开发核心知识点
  • 鸿蒙智行6月交付新车52747辆 单日交付量3651辆
  • android studio 运行,偶然会导致死机,设置Memory Settings尝试解决
  • OneFileLLM:一键聚合多源信息流