悠悠楠杉
MySQL查看表索引创建语句与类型详解:从基础到实践
一、为什么要查看表索引结构?
在数据库优化过程中,索引是提升查询性能的关键因素。通过分析现有索引的创建语句和类型,我们可以:
- 发现冗余或无效索引
- 验证复合索引字段顺序是否合理
- 检查索引类型是否匹配业务场景
- 为SQL优化提供依据
二、查看索引创建语句的5种方法
方法1:SHOW CREATE TABLE(最常用)
sql
SHOW CREATE TABLE employees;
输出示例:
sql
CREATE TABLE `employees` (
`emp_no` int NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`),
KEY `idx_name` (`last_name`,`first_name`),
UNIQUE KEY `idx_hire` (`hire_date`)
) ENGINE=InnoDB
方法2:SHOW INDEX(获取详细信息)
sql
SHOW INDEX FROM employees;
输出包含以下关键字段:
- Table: 表名
- Nonunique: 是否唯一索引(0/1)
- Keyname: 索引名称
- Seqinindex: 索引中的字段顺序
- Column_name: 字段名
- Collation: 排序方式(A升序/D降序)
- Cardinality: 基数(估算的唯一值数量)
方法3:查询information_schema(适合批量分析)
sql
SELECT * FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'employees';
方法4:使用EXPLAIN分析(验证索引使用情况)
sql
EXPLAIN SELECT * FROM employees WHERE last_name = 'Smith';
方法5:mysqldump导出表结构
bash
mysqldump -d -u root -p your_db employees > schema.sql
三、MySQL索引类型详解与创建方法
1. 普通索引(INDEX)
最基本的索引类型,没有唯一性约束:sql
-- 创建语法
CREATE INDEX idxname ON employees(lastname);
-- 修改表结构方式
ALTER TABLE employees ADD INDEX idxname (lastname);
2. 唯一索引(UNIQUE INDEX)
保证字段值唯一性:
sql
CREATE UNIQUE INDEX idx_email ON employees(email);
3. 主键索引(PRIMARY KEY)
特殊的唯一索引,不允许NULL值:
sql
ALTER TABLE employees ADD PRIMARY KEY (emp_no);
4. 全文索引(FULLTEXT)
适用于文本搜索(仅MyISAM/InnoDB支持):
sql
ALTER TABLE articles ADD FULLTEXT INDEX idx_content (content);
5. 空间索引(SPATIAL)
用于地理数据(仅MyISAM支持):
sql
CREATE SPATIAL INDEX idx_location ON map_data(coordinates);
6. 复合索引(多列索引)
sql
-- 字段顺序直接影响查询效率
CREATE INDEX idx_name_dep ON employees(last_name, department);
四、索引优化实战案例
场景:用户表查询缓慢sql
-- 原始表结构
CREATE TABLE users (
id INT AUTOINCREMENT,
username VARCHAR(50),
mobile CHAR(11),
regdate DATETIME,
PRIMARY KEY (id)
);
-- 问题查询
SELECT * FROM users WHERE mobile = '13800138000' ORDER BY reg_date DESC;
优化步骤:
1. 分析现有索引
sql
SHOW INDEX FROM users; -- 发现只有主键索引
添加合适索引
sql ALTER TABLE users ADD UNIQUE INDEX idx_mobile (mobile), ADD INDEX idx_reg_date (reg_date);
进一步优化(使用覆盖索引)
sql ALTER TABLE users ADD INDEX idx_mobile_reg (mobile, reg_date);
五、常见问题解答
Q1:如何判断索引是否被使用?sql
-- 查看索引使用统计
SELECT * FROM sys.schemaindexstatistics
WHERE tableschema = 'yourdb';
-- 使用performanceschema SELECT * FROM performanceschema.tableiowaitssummarybyindexusage;
Q2:为什么SHOW CREATE TABLE看不到所有索引?
可能是工具显示限制,建议用SHOW INDEX或查询information_schema获取完整信息。
Q3:如何删除不需要的索引?
sql
DROP INDEX idx_name ON table_name;
-- 或
ALTER TABLE table_name DROP INDEX idx_name;
通过系统性地分析索引结构和类型,我们可以显著提升数据库查询性能。建议定期使用ANALYZE TABLE
更新索引统计信息,确保查询优化器做出正确决策。