索引语法
//创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name ( index_col_name,... );
//查看索引
SHOW INDEX FROM table_name;
//删除索引
DROP INDEX index_name ON table_name;
示例
// 查看索引
show index from tb_user;
// 1. name字段为姓名字段,该字段的值可能会重复,为该字段创建索引
create index idx_user_name on tb_user(name);
// 2. phone手机号字段的值,是非空且唯一的,为该字段创建唯一索引
create unique index idx_user_phone on tb_user(phone);
// 3. 为 profession、age、status 创建联合索引
create index idx_user_pro_age_sta on tb_user(profession,age,status);
// 4. 删除 name 索引
drop index idx_user_name on tb_user;
步骤1~2 创建普通索引和唯一索引:
步骤3 创建联合索引:
步骤4 删除索引:
索引性能分析
EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。
语法:
-- 直接在select语句之前加上关键字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;
示例:
参数说明:
索引失效
- 违反最左前缀法则
- 范围查询右边的列,不能使用索引
- 不要在索引列上进行运算操作, 索引将失效
- 字符串不加单引号,造成索引失效。(类型转换)
- 以%开头的Like模糊查询,索引失效
示例-违反最左前缀法则
创建联合索引,字段顺序:name, status, address
如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。匹配最左前缀法则,走索引:
违反最左前法则,索引失效,key为NULL说明未命中索引:
如果符合最左法则,但是出现跳跃某一列,只有最左列索引生效,key_len的值和只判断name时相同:
相关链接:
MySQL索引背后的数据结构及算法原理