工具猿之MySQL教程-05-索引详细操作管理

点点圈 提交于 2020-01-01 19:51:01

索引详细操作管理

一、认识索引:  
   1、了解索引   2、索引分类   3、索引设计原则  
二、管理索引:  
   1、创建索引   2、查看索引   3、删除索引  

一、认识索引

  • 了解索引

索引是一种特殊的数据库结构,可以用来快速查询数据库中的特定记录。在MySQL中,所有的数据类型都可以被索引。MySQL支持的索引主要有Hash索引和B-Tree索引。目前,大部分MySQL索引都是以B-Tree(B-树)方式存储,是MySQL数据库中使用最频繁的索引类型。
讨论:
   (1)BLOB和TEXT类型字段仅支持前缀索引。
   (2)使用 “!=” 以及 “<>” 的时候,MySQL不使用索引。
   (3)使用LIKE的时候,以 “%” 开头,即使用 “%****” 的时候无法使用索引;在使用OR的时候。要求OR前后字段都要有索引。
   (4)当字段使用函数时候,MySQL无法使用索引;在连接条件字段类型不一致的时候,MySQL无法使用索引;在组合索引里使用非第一个索引时也不使用索引。
   (5)索引是一个简单的表,MySQL将一个表的索引都保存到同一个索引文件中,所以索引也是占物理空间的,如果有大量的索引,索引文件可能会比数据文件更快的到达最大的文件尺寸。
   (6)在更新的表中引入索引列上的数据时,MySQL会自动地更新索引,索引树总是和表的内容保持一致。这可能需要重新组织一个索引,如果表中有大量索引,是很浪费时间的,也就是说会降低增删改查和其他写入操作效率。表中索引越多,更新表的时间就越长。
   (7)如果从表中删除列,则索引可能会受到影响,如果所删除的列是索引组成部分,则该列也会从索引中删除,如果组成索引的所有列都被删除,则整个索引将被删除。

  • 索引分类

MySQL的索引包括普通索引(index)、唯一性索引(unique)、主键(primary key)、全文索引(fulltext)和空间索引(spatial)。
  普通索引(index):索引的关键字是 index ,这是最基本的索引,它没有任何限制。
  唯一性索引(unique):关键字是 unique ,与普通索引类似,但是 unique 索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。在任何一个表上可以创建多个 unique 索引。
  主键(primary key):它是一种特殊的唯一索引,不允许有空值。一般是建表时同时创建主键索引。也可以通过修改表的方法增加主键,但一个表只能有一个主键。
  全文索引(fulltext):fulltial 索引只能对 char 、varchar 和 text 类型的列编制索引,并且只能在MyISAM表中编制。在MySQL默认情况下,对于中文作用不大。
  空间索引(spatial):spatial 索引只能对空间列编制索引,并且只能在MyISAM表中编制。
另外,按索引建立在一列还是多列上,又可以分为单列索引、多列索引(复合索引)。

  • 索引设计原则

为了使索引的使用效率更高,在创建索引的时候必须考虑在哪些字段上创建索引和创建什么类型的索引。原则如下:
  (1)在主键上创建索引,在InnoDB中如果通过主键来访问数据效率是非常高的。
  (2)为经常需要排序、分组、联合操作的字段建立索引,也就是哪些将用于 join、where判断和 order by 排序的字段上。
  (3)为经常作为查询条件的字段建立索引,比如用 join、where 判断的字段。
  (4)尽量不要对数据库中某个含有大量重复的值的字段建立索引,比如 “性别” 字段。
  (5)限制索引的数目。
  (6)尽量使用数据量少的索引。
  (7)尽量使用前缀来索引。
  (8)删除不再使用或者使用很少的索引。

二、管理索引

  • 创建索引

1、创建表时创建索引
创建表时可以创建索引,这种方式最简单、方便。
a、创建 students2 表,stu_num为主键索引,stu_name为唯一性索引(名为name_index),并在stu_address列上前五位字符创建索引(名为address_index)。

mysql> create table if not exists students2(
    -> stu_num char(20) not null comment'学生学号',
    -> stu_name char(6) not null comment'学生姓名',
    -> stu_sex enum('男','女') default'男' comment'学生性别',
    -> stu_birthday date not null comment'学生出生日期',
    -> dep_num char(18) not null comment'院系编号',
    -> stu_address varchar(20) not null comment'学生家庭住址',
    -> stu_phone varchar(18) not null comment'学生联系电话',
    -> stu_photo blob comment'学生照片',
    -> primary key(stu_num),
    -> unique index name_index(stu_name),
    -> index address_index(stu_address(5)));

在这里插入图片描述
2、用 create index 语句创建索引
如果表已经创建好了,可以用 create index 语句建立索引。
a、创建普通索引。
为便于按地址查询,为 students 表的 stu_address 列上的前6个字符建立一个名为 address_index的升序索引。

mysql> create index address_index on students(stu_address(6) ASC);

在这里插入图片描述
为经常作为查询条件的字段建立索引。比如在students表中的 dep_num 字段创建一个名为 dep_num_index 普通索引。

mysql> create index dep_num_index on students(dep_num);

在这里插入图片描述
b、创建唯一性索引。
像学生的姓名、专业名称、部门名称、商品名称等之类的字段,一般情况下可建立一个唯一性索引。
在 course (课程表)中的 course_name 列上建立一个名为course_name_index的唯一性索引。

mysql> create unique index course_name_index on course(course_name);

在这里插入图片描述
在 teachers (教师表)中的 tea_name 列上建立一个名为 tea_name_index 的唯一性索引。

mysql> create unique index tea_name_index on teachers(tea_name);

在这里插入图片描述
c、创建多列索引。
可以在一个索引的定义中包含多个列,中间用逗号隔开,但是它们要属于同一个表,这样的索引叫做多列索引(复合索引)。
在achievement(成绩表)中的 stu_num 和 course_num 列上建立一个名为 stu_course_index 的复合索引。

mysql> create index stu_course_index on achievement(stu_num,course_num);

在这里插入图片描述
讨论:
  1、对于 char 和 varchar 列,只用该列的一部分就可以创建索引,创建索引时用 col_name(length) 语法,对前缀编制索引。前缀包括每列值的前 length 个字符。blob 和 text 列也可以编制索引,但是必须给出前缀长度。
  2、create index 不能创建主键索引,创建主键索引用 alter table … add primary key()。
  3、索引名可以不写,若不写,默认与列名相同。
3、用 alter table 语句创建索引
在已经形成的表中可以用 alter table 语句创建索引。
a、在teachers(教师信息表)中建立tea_num主键索引,建立tea_name和dep_num的复合索引,名为 tea_dep_index,加速表得检索速度。

mysql> alter table teachers 
    -> add primary key(tea_num),
    -> add index tea_dep_index (tea_num,dep_num);

在这里插入图片描述
b、在 departments(院系表)中的dep_num建立名为 dep_num_index唯一性索引。

mysql> alter table departments add unique index dep_num_index(dep_num);

在这里插入图片描述

  • 查看索引

如果想要查看表中创建的索引的情况,可以使用 show index 语句。
a、查看 students(学生信息表)中的索引情况。

mysql> show index from students;

在这里插入图片描述

  • 删除索引

删除索引是指将表中已经存在的索引删除,可以用 drop index 语句或者 alter table 语句删除。
a、用drop index语句删除course(课程表)中的 course_name_index 唯一性索引。

语法格式:drop index 所要删除的表名 on 索引所在表;

mysql> drop index course_name_index on course;

在这里插入图片描述
b、用 alter table 语句删除 teachers(教师信息表)中的 主键和 tea_dep_index 复合索引。

mysql> alter table teachers 
    -> drop primary key,
    -> drop index tea_dep_index;

在这里插入图片描述
讨论:
  1、drop index 语句可以删除各种类型的索引。
  2、删除唯一性索引,如同删除普通索引一样,用 drop index 语句即可,不能写成 drop unique index ,但是创建唯一性索引时,要 add unique index。
  3、删除主键索引,直接使用 drop primary key 子句进行删除,不需要提供索引名称,因为一个表就有一个主键。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!