MySQL索引篇之索引是什么?

2020-11-10 14:27:19 浏览数 (1)

  通过几篇文章我们来讨论下索引相关的内容,本文我们先来简单的了解下索引的相关概念。 数据库的版本是 8.0.2

索引是什么?

  现在我们数据库中有一张表,表中的数据有500W条,先在我们没有使用索引的情况下根据name来查询

代码语言:javascript复制
select * from user_innodb where name='波波'

  我们看到的查询时间是2.214秒。那如果我们给这张表的name字段加上索引会怎么样呢?

代码语言:javascript复制
ALTER TABLE `user_innodb`
ADD INDEX `idx_user_name` (`name`) USING BTREE ;

  创建索引会比较耗时间,耐心等待会~ 创建成功后我们再次执行相同的查询语句效果如下

  通过对比发现,有索引的请求比没有索引的情况,效果相差了几十倍上百倍。通过这个案例大家应该可以非常直观地感受到,索引对于数据检索的性能改善是非常大的。   那么索引到底是什么呢?为什么可以对我们的查询产生这么大的影响?创建索引的时候发生了什么事情?

1.索引的定义

  维基百科对数据库索引的定义:

数据库索引,是数据库管理系统(DBMS)中一个排序数据结构,以协助快速查询、更新数据库表中数据。

  数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,我们要从500万行数据里面检索一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。   但是我们有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。

2.索引的类型

  在MySQL的所有中支持三种索引类型

类型

描述

Normal

普通索引

Unique

唯一索引

Fulltext

全文索引

Normal

  也叫非唯一索引,是最普通的索引,没有任何的限制

代码语言:javascript复制
# 直接创建索引
CREATE INDEX index_name ON table(column(length))

# 修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))

# 创建表的时候同时创建索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)

# 删除索引
DROP INDEX index_name ON table

Unique

  唯一索引要求键值不能重复。另外需要注意的是,主键索引是一种特殊的唯一索引,它还多了一个限制条件,要求键值不能为空。主键索引用primary key创建。

代码语言:javascript复制
#创建唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length))

#修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

#创建表的时候直接指定
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
UNIQUE indexName (title(length))

Fulltext

  MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

代码语言:javascript复制
#创建表的适合添加全文索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);

#修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)

#直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)

~好了通过本文的介绍,相信大家对于索引应该有了个基本的认知,那么我们下篇文章就来给大家分析下索引的具体的存储结构!

最后感觉波波给大家分享的文章对你有帮助麻烦点赞加关注哦~ ^ _ ^

0 人点赞