Mysql索引的创建与设计原则

1,索引的分类:

索引包括普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引;

从功能逻辑分:普通索引,唯一性索引,主键索引,全文索引。

按照物理实现方式:聚簇索引和非聚簇索引。

按照作用字段个数:单列索引和联合索引

1,全文索引 :不加任何限制条件,只是用于提高查询速度。不要求非空唯一。

2,唯一性索引:使用unique参数可以设置为唯一索引,允许为空,一张数据表可以有多个唯一性索引。

3, 主键索引:特殊的唯一索引,不能为空,一张表只能有一个主键索引。

4,单列索引:在单个字段上创建索引,一个表可以有多个点列索引

5,多列索引:多个字段组合创建的索引, 遵循最左前缀集合。

6,全文索引:使用参数fulltext可以设置索引为全文索引,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。分为 自然语言的全文检索和布尔的全文检索。

7,空间索引:使用参数spatial。

2,创建索引

创建索引的三种方式:

1,创建表时创建索引

隐式的方式创建索引。在声明有主键约束,唯一性约束,外键约束的字段上,会自动的添加相关的索引。

create table dept(
id  int primary key auto_increment, //主键索引
name varchar(20) unique,//唯一索引
constraint e_d_id foreign key(did) references dept(dept_id),//外键索引
)

显示方式的创建

创建普通索引

create table dept(
    id  int ,
    name varchar(20) ,
    info varchar(20),
  #声明索引
    index index_name (name),
    unique index uk_c(info)  #唯一性索引   单列索引
)

删除主键索引:

alter table 表名 drop primary key;

创建联合索引

create table dept(
    id  int ,
    name varchar(20) ,
    info varchar(20),
    #声明索引
    index index_name_info (name,info)
)

创建全文索引

只为char, varchar和text列创建索引,对整个列进行,不支持局部索引。

create table dept(
    id  int ,
    name varchar(20) ,
    info varchar(20),
    #50代表只使用前50个进行构建索引
    fullText index futxt_info(info(50))
    )

创建全文索引之后 使用match+against方式查询,提高查询效率

select * from dept where match (info) against('查询字符串')

如果需要全文索引 的事大量数据,先添加数据再创建索引。

通过命令查看索引

方式1,

show create table dept;--depet代表表名

方式2,

show index from dept;--depet代表表名

2,通过alter table创建索引

表已经创建成功添加索引

1,altert table .....add....

Alter table 表名 add index id_cmm (name),

Alter table 表名 add unique uk_name(name),

Alter table 表名 add index nul_id_name(id,name)

3,通过create index创建索引

create index....... on .........

create index id_name on emp(name);

create unique index id_name on emp(name);

3,删除索引

1,alter table

alter table 表名 drop index 索引名

注意:添加auto_increment 约束字段的唯一索引不能删除

2,drop index

drop index 索引名 on 表名

删除字段之后,索引相应删除。

联合索引,如果删除的列为索引的组成部分,则该列也会从索引中删除,如果组成索引的列全部被删除,相应的索引也会被删除。

7,索引的新特性

1,降序索引

create table dept(
    id  int ,
    id2 int,
    index index_id_id1(id ASC,id2 DESC )
)
​
Explain select * from dept order by a, b desc limit 5; 

2,隐藏索引

1,为什么使用隐藏索引

数据量大时,删除索引容易出错,所以使用隐藏索引,将待删除的索引设置为隐藏索引,确认是否出错,没有出错则可以删除索引。这种方式叫做软删除。

可以验证删除索引之后性能是否有影响,可以使用隐藏索引。

注意:主键不能设置为隐藏索引,当表中没有主键时,表中第一个唯一非空索引会成为隐式主键。

2,创建隐藏索引

create table dept(
    id  int ,
    name varchar(20) ,
    info varchar(20),
    con  varchar(20),
    #创建隐式索引 
    index idx_name (name) invisible
    )
alter table dept add unique index uk_name(name) invisible,
create index idx_name on dept (name) 

3,修改索引的可见性

alter table dept alter index idx_name invisible #由可见修改为不可见

如果一个索引长期隐藏不如删除,影响性能

4,隐藏索引对查询优化可见

mysql> select @@optimizer_switch \G

使隐藏索引有效

use_invisible_indexes=on;

8,索引的设计原则

1,索引设计的不合理或者缺少索引都会影响性能。 ​ ​ ​

1,适合创建索引的11种情况

1,字段的数值有唯一性限制

某个字段是唯一性的,可以直接创建唯一性索引

业务上具有唯一特性的字段,即使是组合字段也必须建成唯一索引。

2,频繁作为where查询条件的字段

3,经常group by 和order by 的列

4, 在UPDATE ,DELETE 的where 条件列

如果进行更新时,更新的字段是非索引字段,提升的效率会更加的明显,这是因为非索引你字段更新不需要对索引进行维护

5,DISTINCT 字段需要创建索引

6,多表join链接操作时,创建索引注意事项

首先链接的表尽量不要超过三张。

其次对where条件创建索引

最后对用于连接的字段创建索引 并且该字段在多张表中的类型必须一致。

7,使用列的类型小的创建索引

类型的大小指的是数据范围的大小

8,使用字符串的前缀创建索引

截取字段前面一部分内容建立索引

怎么计算不同长度的选择性?

1,先看一下字段在全部数据中的选择度

select count(distinct address) /count(*) fropm 表名

2,通过不同的长度去计算,与全表的选择性对比

count(distinct left(列名,索引长度)) / count(*)

e.g

select count(distinct left(address,12 ))/count(*) as sub from emp;

注意:

在varchar字段上简历索引时,必须指定索引的长度,没必要对全字段进行索引。

9,区分度高(散列性)高的列适合作为索引

列的基数指的是某一列中不重复数据的个数。最好为基数大的列建立索引

在记录行数一定的情况下,列的基数越大,该列中的值越分散。

10,使用最频繁的列放到联合索引的最左侧

11,在多个字段都要创建索引的形况下,联合索引优于单值索引

注意:索引数目不是越多越好 建议单张不超过六个

因为每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大

索引会影响 insert delete update 的性能,因为表中的数据更改的同事索引也会进行调整和更新,会造成负担

优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,会增加MySQL优化器生成执行计划时间,降低查询性能。

2,不适合创建索引的情况

1,在where中使用不到的字段,不要设置索引

2,数据量小的表最好不要使用索引

3, 有大量重复数据的列不要建立索引

数据重复度高于10% 的时候,不需要对这个字段使用索引

4, 避免对经常更新的表创建过多的索引

5,不建议无序的值作为索引

6,删除不在使用或者很少使用的索引

7,不要定义冗余或者重复的索引

索引可以提高查询效率。也会降低插入和更新的速度并占用磁盘空间

 

转载请注明出处

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值