一、给信息表创建索引
信息表为:
创建索引:create index +索引名 on 表名(列名...);
mysql> create index idx_lname_pinyin on employee(lname_pinyin);
显示索引信息:show index from +表名;
mysql> show index from employee\G
show index 命令下的项目列表
项目名称 |
说明 |
Table |
对象表名 |
Non_unique |
是否允许重复(1:允许; 0:禁止) |
Key_name |
索引名 |
Seq_in_index |
内的域序号( 从1开始) |
Column_name |
域名 |
Collation |
排序(A:升序,null:不排序) |
Cardinality |
索引内的非重复值的数目 |
Sub_part |
作为索引部分的域内的字符数目 |
Packed |
关键字压缩方式 |
Null |
是否允许null |
Comment |
索引的类型 |
Index_comment |
备注 |
删除索引:
drop index 索引名 on 表名
丛生索引:通常的索引在子叶节点中保存指向实际表的指针,丛生索引保存的子叶节点保存的是实际数据
丛生索引的优点:
1、不需要为保存索引而使用专门的硬盘空间,节约了资源
2、不需要检索索引后再访问实际的表,提高了索引效率
但是创建丛生索引时需要对表中的数据进行排序,在进行数据插入、更新、删除时比一般的索引需要耗费更多的时间
二、创建多列构成的复合索引及唯一性索引
mysql> create index idx_pinyin on employee(lname_pinyin,fname_pinyin);
三、确认信息表索引的使用状态,分析索引优劣
mysql> explain select *from employee where lname_pinyin='wang'\G
项目 |
说明 |
说明 |
ID |
SELECT命令的序号(通常为1,子查询的话往往从序号2开始) | |
select_type |
select的命令种类 | |
SIMPLE |
单纯的SELECT命令 | |
PRIMARY |
最外层的SELECT命令 | |
UNION |
由UNION语句连接的SELECT命令 | |
DEPENDENT UNION |
由UNION语句连接的SELECT命令(依赖外部查询) | |
SUBQUERY |
子查询中的SELECT命令 | |
DEPENDENT SUBQUERY |
子查询中的SELECT命令(依赖外部查询) | |
DERIVED |
派生表(FROM语句的子查询) | |
Table |
表名 | |
type |
表的连接类型 |
(按效率的高低排序) |
system |
只存在一条记录的表(=系统表) | |
const |
常量,拥有PRIMARY KEY/UNIQUE制约的索引(结果总为1行) | |
eq_ref |
连接时由PRIMARY KEY/UNIQUE列进行的等值查询 | |
ref |
非UNIQUE列进行的等值查询 | |
ref_or_null |
ref中加入了[~OR列名IS NULL]的检索 | |
range |
使用索引检查一定范围的记录(=,<>,>,>=,<,<=,IS NULL,<>,BETWEEN,IN等运算符) | |
index |
全索引扫描 | |
ALL |
全表扫描 | |
possible keys |
检索时可能使用到的索引(不存在索引时为NULL) | |
key |
检索时真实使用到的索引(未使用索引时为NULL) | |
key_len |
使用的索引的关键字长度(单位为bytes) | |
Ref |
需要时与比较的列,或者定制(const) | |
rows |
需要遍历的记录数量 | |
Extra |
查询时的追加信息 (值为index时,使用了覆盖索引,性能最好) |
四、索引时效的场合总结
1、进行后方一致/部分一致检索的场合,模糊检索是不能用索引的;
应尽量使用前方一致或者完全一致的形式进行检索
如:select *from employee where lname_pinyin like '%w'; --是错误的
2、使用了is not null、[<>]比较运算符的场合,也不能使用索引
如:select *from employee where lname_pinyin is not null;--是错的
3、对列使用了运算、函数的场合,也不能使用索引
如:select *from employee where year(birth)='1988';--这里对birth这列使用了year函数
4、复合索引的第一列没有包含在where条件语句中的场合
如创建了复合索引
create index idx_pinyin on employee(lname_pinyin,fname_pinyin);
但是索引时第一列lname没有包含在where条件里
如:select *from employee where fname_pinyin='xiao' --没有包含第一列lname_pinyin