如何在数据库中使用索引

一、给信息表创建索引

信息表为:

创建索引: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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简书-乡村码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值