Java --- MySQL8之索引的创建与设计原则

目录

一、索引的分类

1.1、普通索引

1.2、唯一索引

 1.3、主键索引

1.4、单列索引

1.5、多列(联合)索引

1.6、全文索引

二、创建索引

2.1、使用 CREATE TABLE创建

2.1.1、创建普通索引 

2.1.2、创建唯一索引

 2.1.3、创建主键索引

2.1.4、创建单列索引

2.1.5、创建联合索引

 2.1.6、创建全文索引

2.2、给已存在的表创建索引 

三、查看索引

 四、删除索引

五、MySQL8索引新特性

5.1、支持降序索引 

5.2、隐藏索引

5.2.1、创建隐藏索引

5.2.2、修改索引的可见性

 六、创建索引的条件

6.1、适合创建索引的情况

6.1.1、字段的数值有唯一性

6.1.2、频繁作为where查询条件的字段

6.1.3、经常group by 和 order by的列

6.1.4、update、delete的where条件 

 6.1.5、distinct字段需要创建索引

6.1.6 、多表join连接操作时,创建索引注意事项

 6.1.7、使用列的类型小的创建索引

6.1.8、使用字符串前缀创建索引

6.1.9、区分度高的列适合作为索引 

6.1.10、使用最频繁的列放在联合索引的左侧

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

6.2、限制索引的数目

6.3、不适合创建索引的情况

6.3.1、在where使用不到的字段,不要设置索引 

6.3.2、在数据量小的表不要使用索引 

6.3.3、有大量重复数据的列上不要建立索引

6.3.4、避免对经常更新的表创建过多的索引

6.3.5、不要用无序的值作为索引 

6.3.6、删除不再使用或少用的索引 

6.3.7、不要定义冗余或重复的索引 

一、索引的分类

1.1、普通索引

创建普通索引不需要加任何限制条件,在任何数据类型中都可以创建,主要提高查询效率

1.2、唯一索引

有限制条件,创建唯一索引,索引所在的字段值必须是唯一的,可以为空。一张表可以有多个唯一索引。

 1.3、主键索引

是一种特殊唯一的索引,在唯一索引的基础上增加了不为空的约束,一张表只能有一个唯一索引。

1.4、单列索引

在表中的单个字段上创建的索引。一个表中可以有多个单列索引。

1.5、多列(联合)索引

在表中的多个字段组合上创建一个索引。

1.6、全文索引

 使用FULLTEXT设置索引为全文索引

二、创建索引

2.1、使用 CREATE TABLE创建

这是一种隐式创建索引的方式,在声明主键约束,唯一性约束、外键约束时会自动添加相关索引

CREATE TABLE dept(
 dept_id INT PRIMARY KEY AUTO_INCREMENT,
 dept_name VARCHAR(20)
);

CREATE TABLE emp(
 emp_id INT PRIMARY KEY AUTO_INCREMENT,
 emp_name VARCHAR(20) UNIQUE,
 dept_id INT,
 CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);

 

2.1.1、创建普通索引 

 使用INDEX 索引名(字段名)或KEY来进行声明

CREATE TABLE book(
book_id INT,
book_name VARCHAR(20),
AUTHORS VARCHAR(20),
#声明索引
INDEX idx_bname(book_name)
);

2.1.2、创建唯一索引

CREATE TABLE book1(
book_id INT,
book_name VARCHAR(20),
AUTHORS VARCHAR(20),
#声明索引
UNIQUE INDEX uk_idx_aut(AUTHORS)
);

 2.1.3、创建主键索引

CREATE TABLE book2(
#声明索引
book_id INT PRIMARY KEY ,
book_name VARCHAR(20),
`AUTHORS` VARCHAR(20)
);

#删除主键索引
ALTER TABLE book2 DROP PRIMARY KEY;

2.1.4、创建单列索引

CREATE TABLE book1(
book_id INT,
book_name VARCHAR(20),
AUTHORS VARCHAR(20),
#声明索引
UNIQUE INDEX uk_idx_aut(AUTHORS)
);

2.1.5、创建联合索引

CREATE TABLE book3(
book_id INT,
book_name VARCHAR(20),
`AUTHORS` VARCHAR(20),
#声明索引
INDEX mul_bid_bname_info(book_id,book_name,`AUTHORS`)
);

 2.1.6、创建全文索引

CREATE TABLE book4(
book_id INT,
book_name VARCHAR(20),
`AUTHORS` VARCHAR(20),
#声明索引
FULLTEXT INDEX ftxt_idx_bname(book_name(10))
);

2.2、给已存在的表创建索引 

方式1:

CREATE TABLE book5(
book_id INT,
book_name VARCHAR(20),
`AUTHORS` VARCHAR(20),
info VARCHAR(20)
);


#ALTER TABLE 表名 ADD INDEX 索引名(字段名)
#添加普通索引
ALTER TABLE book5 ADD INDEX idx_info(info);
#添加唯一索引
ALTER TABLE book5 ADD UNIQUE uk_idx_bname(book_name);
#添加联合索引
ALTER TABLE book5 ADD INDEX mul_bid_bname_binfo(book_id,book_name,info);

SHOW INDEX FROM book5;

 方式2:

CREATE TABLE book6(
book_id INT,
book_name VARCHAR(20),
`AUTHORS` VARCHAR(20),
info VARCHAR(20)
);
#CREATE INDEX 索引名 ON 表名(字段名)
#添加普通索引
CREATE INDEX idx_bid ON book6(book_id);
#添加唯一索引
CREATE UNIQUE INDEX uk_idx_bname ON book6(book_name);
#添加联合索引
CREATE INDEX mul_bid_bname_binfo ON book6(book_id,book_name,info);

三、查看索引

方式1:

SHOW CREATE TABLE book\G;

方式2:

SHOW INDEX FROM book;

 四、删除索引

方式1:

#ALTER TABLE 表名 DROP INDEX 索引名;
ALTER TABLE book6 DROP INDEX idx_bid;

方式2:

#DROP INDEX 索引名 ON 表名;
DROP INDEX uk_idx_bname ON book6;
#联合索引中,删除表的字段,索引也会跟着变化
ALTER TABLE book6 DROP COLUMN book_name;

五、MySQL8索引新特性

5.1、支持降序索引 

在MySQL8.0之前创建的仍然是升序索引,使用时使用反向扫描,大大降低了数据库效率。

CREATE TABLE test1(
a INT,
b INT,
INDEX idx_a_b(a ASC,b DESC)
);

5.2、隐藏索引

 主要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鸭鸭老板

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

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

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

打赏作者

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

抵扣说明:

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

余额充值