数据库操作中,常常需要完成既定数据的检索。少量数据存放在表中,只需使用基本的SQL语句即可检索得到。但当数据量较大时,受MySQL数据库底层实现原理的限制,缺省的SQL语句,检索效率较低。

例如:当执行"select * from employee where empno= 520000"语句按员工号查询时,MySQL数据库默认的处理方式是从第一条记录开始依次向后遍历,直到找到id为520000的数据。这样,查找的效率随着数据量的增大,而逐步降低。为此,MySQL数据库在建表时允许通过创建索引来加快数据表的查询、排序等相关操作。

什么是索引

在MySQL数据库中,索引和表、视图、同义词等类似是数据库"对象"的一种。可看做字典的目录。是对数据库表中一列或者多了的值进行排序后的一种结构,其作用就是提高表中的数据查询速度。MySQL中的索引分为如下几种:

1. 普通索引

普通索引是由key或index定义个索引,它是MySQL中的基本索引类型,可以创建在任何数据类型中。其值是否唯一和非空有字段本身的约束条件所决定。例如,在student表的id字段上建立一个普通索引,查询记录时,就可以根据该索引查询,从而提高效率。

2. 唯一性索引

唯一性索引是指由unique定义个索引,该索引所在字段的值必须是唯一的。例如,在grade表的stu_id字段上建立唯一性索引,那么stu_id字段的值就必须是唯一的。

3. 全文索引

全文索引是由fulltext定义的索引,它只能创建在char、varchar或text类型的字段上。并且现在只有MyISAM存储引擎支持全文索引。

4. 单列索引

单列索引指的是在表中单个字段上创建索引,它可以是普通索引、唯一索引或者全文索引,只有保证该索引只对应表中一个字段即可。

5. 多列索引

多列索引是指在表的多个字段上创建索引,只有在查询条件中使用了这些字段中的第一个字段时,该索引才会被使用。如,在student表的id、name和score字段上创建一个多列索引,那么只有查询条件中使用了id字段时,该索引才会被使用。

相较于单列索引,当我们频繁的需要同时检索表中多列时,多列索引的效率会高很多。

6. 空间索引

空间索引是由spatial定义的索引,它只能创建在空间数据类型的字段上。MySQL中的空间数据类型有4种:geometry、point、linestring和polygon。需要注意的是,创建空间索引的字段,必须将其声明为NOT NULL,并且空间索引只能在存储引擎为MyISAM的表中创建。

需要注意的是,虽然索引可以提高数据的查询效率,但索引会占用一定的存储空间。并且创建和维护索引所消耗的时间,是随着数据量的增加而增加的。因此,使用索引时,应综合考虑其优缺点,不能肆意创建。

索引的生成

要想使用索引提高数据表的访问速度,首先要创建一个索引。创建索引的方式大致可分为三种。

创建表指定索引

在MySQL中,创建表时可以直接给表的指定字段指定索引,这种方式需在建表之初就预设了数据即将被频繁检索的场景,其基本语法格式如下所示:

create table 表名 (字段名 数据类型 [完整性约束条件],

字段名 数据类型 [完整性约束条件],

……

字段名 数据类型

[unique|fulltext|spatial] index|key

[别名] (字段名1 [(长度)]) [asc|desc]

);

相关语法解析:

1) unique:可选参数,表示唯一索引。

2) fulltext:可选参数,表示全文索引。

3) spatial:可选参数,表示空间索引

4) index和key:用来表示字段的索引, 二者选一即可。

5) 别名:可选参数,表示穿件的索引名称。

6) 字段名1:指定索引对应字段的名称。

7) 长度:可选参数,用于表示索引的长度。

8) asc和desc:可选参数。asc表升序,desc表降序排列。

MySQL中的6种索引类型,如下:

1) 创建普通索引

【例】在t1表中id字段上创建索引,SQL语句如下:

create table t1 ( id int,

name varchar(20),

score float,

index(id)

);

可使用explain语句查看索引是否被使用,SQL语句如下:

explain select * from t1 where id = 1 ;

2) 创建唯一性索引

【例】创建一个表名为t2的表,在表中的id字段上建立索引名为unique_id的唯一性索引,并按升序排列,SQL语句如下:

create table t2 ( id int not null,

name varchar(20) not null,

score float,

unique index unique_id(id asc)

);

这样,便在id字段上建立了一个名为unique_id的唯一性索引。

3) 创建全文索引

【例】创建一个表名为t3的表,在表中的name字段上建立索引名为fulltext_name的全文索引,SQL语句如下:

create table t3 ( id int not null,

name varchar(20) not null,

score float,

fulltext index fulltext_name(name)

)engine=MyISAM;

这样,即可在name字段上建立一个名为fulltext_name的全文索引。

需要注意的是,由于目前只有MyISAM存储引擎支持全文索引,默认的InnoDB存储引擎不支持全文索引。因此,在建立全文索引时,一定要注意表存储引擎的类型,对于经常需要索引的字符串、文字数据等信息,可以考虑存储到MyISAM存储引擎的表中。

4) 创建单列索引

【例】创建一个表名为t4的表,在表中的name字段上建立索引名为single_name的单列索引,SQL语句如下:

create table t4 ( id int not null,

name varchar(20) not null,

score float,

index single_name(name(20))

);

这样,即可在name字段上建立一个名称为single_name的单列索引,并且索引的长度为20。

5) 创建多列索引

【例】创建一个表名为 t5的表,在表中的id和name字段上建立索引名为multi的多列索引,SQL语句如下:

create table t5 ( id int not null,

name varchar(20) not null,

score float,

index nulti(id, name(20))

);

这样,即可在id和name字段上建立一个名为multi的多列索引。

需要注意的是,在多列索引中,只有查询条件中使用了这些字段中的第一个字段时多列索引才会被使用。

为了验证这个说法是否正确,将id字段作为查询条件,通过explain语句查可看索引的使用情况,SQL语句如下:

explain select * from t5 where id = 1;

但是,如果只使用name字段作为查询条件,multi索引不会被使用。

6) 创建空间索引

【例】创建一个表名为t6的表,在空间类型为geometry的字段上创建空间索引,SQL语句如下:

create table t6 ( id int,

space geometry not null,

spatial index sp(space)

) engine=MyISAM;

这样,即可在t6表中的space字段上建立名称为sp的空间索引了。

需要注意的是,创建空间索引时,所在字段的值不能为空值,并且表的存储引擎为MyISAM。

已有表创建索引

若想在一个已经存在的表上创建索引,可以使用 create index语句,其创建索引的具体语法格式如下所示:

create [unique|fulltext|spatial] index 索引名

on 表名 (字段名 [(长度)] [asc|desc]);

在上述语法格式中,unique、fulltext和spatial都是可选参数,分别用于表示唯一性索引、全文索引和空间索引;index用于指明字段为索引。

为了更好的展示如何使用create index语句在已经存在的表上创建索引,接下来创建一个book表,该表中没有建立任何索引,创建book表的SQL语句如下:

create table book (

bookid int not null,

bookname varchar(255) not null,

authors varchar(255) not null,

info varchar(255) null,

comment varchar(255) null,

publicyear year not null

);

创建好数据表book后,通过具体案例演示如何使用create index语句在已经存在的数据表中创建索引,具体如下:

1) 创建普通索引

【例】在book表中的bookid字段上建立一个名称为index_id的普通索引,SQL语句如下:

create index index_id on book (bookid);

这样,即可在book表中,为bookid字段建立一个名称为index_id的普通索引。

2) 创建唯一性索引

【例】在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,SQL语句如下:

create unique index uniqueidx on book (bookid);

这样,即可在book表中,为bookid字段建立一个名称为uniqueidx的唯一性索引。

3) 创建单列索引

【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示:

create index singleidx on book (comment);

这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。

4) 创建多列索引

【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示:

create index mulitidx on book (authors(20), info(20));

这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。

5) 创建全文索引

【例】删除表book,重新创建表book, 在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示:

drop table book;

然后重新创建表book,SQL语句如下所示:

create table book (

bookid int not null,

bookname varchar(255) not null,

authors varchar(255) not null,

info varchar(255) null,

comment varchar(255) null,

publicyear year not null

)engine=MyISAM;

接下来使用create index 语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示:

create fulltext index fulltextidx on book (info);

这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。

6) 创建空间索引

【例】创建表t7,在表中的g字段上创建名称为spatialidx的空间索引。

首先创建数据表t7,SQL语句如下所示:

create table t7 (g geometry not null) engine=MyISAM;

使用create index 语句在t7表的g字段上,创建名称为spatialidx的空间索引,SQL语句如下所示:

create spatial index spatialidx on t7 (g);

这样,即可在t7表中,为g字段建立一个名称为spatialidx的空间索引。

修改表追加索引

在一张已经存在的数据库表中创建索引,除了可以使用create index语句外,还可以使用alter table语句来完成。其语法格式:

alter table 表名 add [unique|fulltext|spatial] index

索引名 (字段名 [(长度)] [asc|desc])

在上述语法格式中,unique、fulltext和spatial都是可选参数,分别用于表示唯一性索引、全文索引和空间索引;add表示向表中添加字段。

接下来,同样以book表为例,对不同类型的索引进行说明, 为了使book表不包含任何索引,首先删除book表,SQL语句如下:

drop table book;

然后重新建立book表,SQL语句如下:

create table book (

bookid int not null,

bookname varchar(255) not null,

authors varchar(255) not null,

info varchar(255) null,

comment varchar(255) null,

publicyear year not null

);

创建好数据表book后,就可以使用alter table语句在已存在的数据表中创建索引了,具体如下:

1) 创建普通索引

【例】在表中的bookid字段上创建名称为index_id的普通索引,SQL语句如下:

alter table book add index index_id(bookid);

这样,即可在book表中,为bookid字段建立一个名称为index_id的普通索引。

2) 创建唯一性索引

【例】在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,SQL语句如下:

alter table book add unique uniqueidx(bookid);

这样,即可在book表中,为bookid字段建立一个名称为uniqueidx的唯一性索引。

3) 创建单列索引

【例】在book表中的comment字段上建立一个名称为singleidx的单列索引,SQL语句如下所示:

alter table book add index singleidx(comment(50));

这样,即可在book表中,为comment字段建立一个名称为singleidx的单列索引。

4) 创建多列索引

【例】在book表中的authors字段和info字段上建立一个名称为mulitidx的多列索引,SQL语句如下所示:

alter table book add index multidx(authors(20), info(50));

这样,即可在book表中,为authors和info字段建立一个名称为mulitidx的多列索引。

5) 创建全文索引

【例】删除表book,重新创建表book, 在book表中的info字段上建立全文索引。首先删除book表。SQL语句如下所示:

drop table book;

然后重新创建表book,SQL语句如下所示:

create table book (

bookid int not null,

bookname varchar(255) not null,

authors varchar(255) not null,

info varchar(255) null,

comment varchar(255) null,

publicyear year not null

)engine=MyISAM;

接下来使用alter table 语句在book表的info字段上创建名称为fulltextidx的全文索引,SQL语句如下所示:

alter table book add fulltext index fulltextidx(info);

这样,即可在book表中,为info字段建立一个名称为fulltextidx的全文索引。

6) 创建空间索引

【例】创建表test,在表中的space字段上创建名称为spatialidx的空间索引。

首先创建数据表t8,SQL语句如下所示:

create table test (space geometry not null) engine=MyISAM;

使用alter table 语句在t8表的space字段上,创建名称为spatialidx的空间索引,SQL语句如下所示:

alter table testadd spatial index spatialidx (space);

这样,即可在t8表中,为space字段建立一个名称为spatialidx的空间索引。

索引的销毁

索引的维护需要消耗磁盘存储,因此,为了避免影响数据库性能,应该及时删除不再使用的索引。删除索引的方法有两种,如下:

修改表删除索引

使用alter table删除索引的基本语法格式如下所示:

alter table 表名 drop index 索引名

【例】删除student表中名称为tb_idx的全文索引

alter table student drop index tb_idx;

上述SQL语句执行后,可以使用show create table语句查看表结构,来确认索引是否已经成功被删除。

show create table student;

直接删除索引

使用drop index删除索引的基本语法格式如下所示:

drop index 索引名 on 表名;

【例】删除test1表中名称为tb_index的空间索引,SQL语句如下:

drop index tb_index on test1

再次使用show create table 语句查看表结构,发现,test1表中名称为tb_index的索引被成功删除。

MySQL数据的高效检索的更多相关文章

  1. 《MySQL必知必会》检索数据,排序检索数据(select ,* ,distinct ,limit , . , order by ,desc)

    <MySQL必知必会>检索数据,排序检索数据 1.检索数据 1.1 select 语句 为了使用SELECT检索表数据,必须至少给出两条信息一想选择什 么,以及从什么地方选择. 1.2 检 ...

  2. 几篇关于MySQL数据同步到Elasticsearch的文章---第一篇:Debezium实现Mysql到Elasticsearch高效实时同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484358&idx=1&sn=3a78347 ...

  3. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  4. 使用Solr索引MySQL数据

    环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\s ...

  5. 如何正确选择MySQL数据列类型

    MySQL数据列类型选择是在我们设计表的时候经常会遇到的问题,下面就教您如何正确选择MySQL数据列类型,供您参考学习. 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性.在选择MyS ...

  6. MYSQL的binary解决mysql数据大小写敏感问题 《转载》

    BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写如下:mysql> select binary 'ABCD'='abcd ...

  7. MySQL数据切分的相关概念和原理详解

    对于数据切分,我们可能还不是很熟悉,但是它对于MySQL数据库来说也是相当重要的一门技术,本文我们就详细介绍一下MySQL数据库的数据切分的相关知识,接下来就让我们一起来了解一下这部分内容. 什么是数 ...

  8. 10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ 1.创建MySQL数据 create database solr; use solr; DROP TABLE ...

  9. solr实时更新mysql数据的方法

    第一步:创建core core是solr的特有概念,每个core是一个查询数据,.索引等的集合体,你可以把它想象成一个独立数据库,我们创建一个新core:名字[core1] 进入linux命令行,进入 ...

随机推荐

  1. 【哲学角度看软件测试】要想软件“一想之美”,UI 测试少不了

    摘要:软件测试的最高层次需求是:UI测试,也就是这个软件"长得好不好看". 为了让读者更好地理解测试,我们从最基础的概念开始介绍.以一个软件的"轮回"为例,下图 ...

  2. 【js】Leetcode每日一题-二叉树的堂兄弟节点

    [js]Leetcode每日一题-二叉树的堂兄弟节点 [题目描述] 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处. 如果二叉树的两个节点深度相同,但 父节点不 ...

  3. Linux的基础操作

    1.概念 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境. 2.Linux的分类 1.按市场需求分为: 图形化界面版.服务器版 2.按原生程度 ...

  4. 将mysql数据同步到ES6.4(全量+增量)

    下载安装包时注意下载到指定文件夹 这里我放在OPT文件夹下一:安装logstash进入到opt文件夹打开终端 执行以下命令wget -c https://artifacts.elastic.co/do ...

  5. 使用Optional处理null

    一.聊聊NullPointerException   相比做Java开发的,见到NullPointerException肯定不陌生吧,可以说见到它深恶痛绝.在开发时认为不会出现NullPointerE ...

  6. BugkuCTF——wp(旧版)

    title: BugkuCTF--wp(旧版) date: 2020-4-25 tags: CTF,比赛 categories: CTF 比赛 Web篇 0x001-web2 解题思路: 1.直接按F ...

  7. [bug] idea @Override is not allowed when implementing interface method

    解决 将idea环境jdk设置一致 参考 https://blog.csdn.net/shenya2/article/details/50460447 https://www.cnblogs.com/ ...

  8. [java] 转型

    A为父类,子类B.C 第20行发生向上转型,a对象调用C覆写过的print()方法 若为A a = new B(); 则调用B覆写过的print()方法 创建对象时使用向上转型,能够统一参数类型(23 ...

  9. Linux 操作系统(一)命令&用户&权限

    以下实例均在Centos7下验证 Centos7 查看命令帮助 man xxx 常用命令 ls / cd - #切到上次目录 cd #回家 cat cat f1 f2 cat f1 f2>f3 ...

  10. 记一次 .NET 某三甲医院HIS系统 内存暴涨分析

    一:背景 1. 讲故事 前几天有位朋友加wx说他的程序遭遇了内存暴涨,求助如何分析? 和这位朋友聊下来,这个dump也是取自一个HIS系统,如朋友所说我这真的是和医院杠上了,这样也好,给自己攒点资源, ...