MySQL 下索引的分类(二)|学习笔记

简介: 快速学习 MySQL 下索引的分类(二)

开发者学堂课程【MySQL 实操课程:MySQL 下索引的分类(二)】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/717/detail/12822


MySQL 下索引的分类(二)

 

内容介绍

一、主键索引

二、前缀索引

三、全文索引

 

一、主键索引

主键索引就是如下图创建表中的主键,具有如下特性:

图片1.png

1、定义

(1)自增。不允许重复,不能为空值。

(2)一般是表的主键 id ;

(3)又叫聚集索引,每张表中有且仅有一个主键,可以由表中一个或多个字段组成。

(4)主键索引必须满足的条件:主键值必须唯一 ;不能包含 Null 值,这点与前面讲解过的唯一性索引不同。该值是自增的。

(5)使用自增列作为主键,可以保证写入数据的顺序也是自增的,在很大程度上提高存取效率。

2、演示

下面进行主键索引的创建演示

首先创建表 user,school,school1 定义属性如下,如:

mysql> show create table user;

mysql> show create table school;

mysql> show create table school1;

mysql> create table school1 (id int (11)auto_increment primary key, name varchar (20) ) ;

然后进行查看表 school1 可以看到,主键 PRIMARY KEY 属性为自增,name 长度为20,如:

mysql> show create table school1;

| school1 | CREATE TABLE ‘school1’

‘id’ int(11) NOT NULL AUTO INCREMENT,

‘name’ varchar (20) DEFAULT NULL,

PRIMARY KEY (‘id’)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+---------+--------------------------+

1 row in set (0.00 sec)

此时查看 school1 表单,可以发现之前并没有创建索引,而这里自动创建了索引,列是id,列表名是 school1,Key 类型为 PRIMARY这里说明了 mysql 数据库的一个原则,就是当创建一个表,如果里面有一个自增并且是主键的一个列,那么就会自动的在主键的自增列道上增加一个主键索引,如:

mysql> show indexes from school1;

Table   | Non_unique | Key_name | Seq in index…

school1 |          0  | PRIMARY  |           1…

1 row in set(0.00 sec)

再向表中插入如下几条数据,这里没有复制 id,因为 id 是属于自增的,如:

mysql> insert into school1 (name) values ( ' yizhong') ;

Query OK, 1 row affected (0.00 sec)

mysql> insert into school1 (name) values ( ' erzhongzhong') ;

Query OK, 1 row affected (0.01 sec)

mysql> insert into school1 (name) values ( ' sanzhong') ;

Query OK, 1 row affected (0.00 sec)

数据插入成功,下面进行查看 id=1 的数据,发现自动进行的主键的索引,如:

mysql> explain select from school1 where id=1;

+----+------------+-------+-----------+-----+--------------+---…

|  id | select_type | table  | partitions | type | possible keys | key…

|   1| SIMPLE     |school1| NULL    |const| PRIMARY     |PRI…

+----+------------+-------+-----------+-----+--------------+---…

1 row in set, 1 warning (0.00 sec)

这就是主键索引的用法,所以在设计表的时候尽量去设置主键面,也叫技术主键,用来表示主键,不具有任何业务含义。因为这里 name 没有加索引,所以如果查询name 是不会进行索引的。

 

二、前缀索引

1、定义

abc 建立索引相当于 a,ab,abc 建立索引。

图片2.png

前缀索引主要是为了高效,比如说有些字段属于字符串型的,字符串长度比较长,如果给整个字符串都建立索引,会增加索引存储的开销,也会降低检索的效率,所以引发了对字符串前几个字符进行建立索引的思考,就是前缀索引。

2、演示

下面进行演示

创建表 company,设置属性,如:

mysql> create table company (id int (11),name varchar (50));

Query OK, 0 rows affected (0.01 sec)

前缀索引的关键词还是 index,没有其他的修饰符,插入 name 数据 idx_name 并将表名为 company 中的 name 字段设置为5,插入成功后进行查看,如:

mysql> create index idx_name on company (name (5));

Query OK,0 rows affected (0.02 sec)

Records: 0 Duplicates: 0 warnings:

mysql> show indexes from company;

|  Table    | Non_unique | Key_name | Seq…  | Sub part…

| company  |           1 | idx_name |     1… |        5…

1 row in set (0.00 sec)

向表中写入数据,如下:

mysql> insert into company values (1001, 'ibm') ;

Query OK,1 row affected (0.00 sec)

mysql> insert into company values (1002, ' microsoft') ;

Query OK, 1 row affected (0.00 sec)

mysql> insert into company values (1003, 'oracle');

Query OK, 1 row affected (0.00 sec)

然后查看数据是否插入成功。插入成功后进行查询,可以发现,查询的数据正确,并且呈现形式相同。

mysql> select * from company where name= ' ibm ' ;

mysql> explain select from company where name= ' ibm' ;

+----+------------+-------+-----------+-----+--------------+---…

|  id | select_type | table  | partitions | type | possible keys | key…

|   1| SIMPLE    |company| NULL    |ref  | idx_name    |8…

+----+------------+-------+-----------+-----+--------------+---…

1 row in set, 1 warning (0.00 sec)

mysql> explain select*from company where name ' microsoft' ;

+----+------------+-------+-----------+-----+--------------+---…

|  id | select_type | table  | partitions | type | possible keys | key…

|   1| SIMPLE    |company| NULL    |ref  | idx_name    |8…

+----+------------+-------+-----------+-----+--------------+---…

1 row in set, 1 warning (0.00 sec)

写成下面语法形式也是可以的,如:

mysql> explain select*from company where name like ' micro%' ;

+----+------------+-------+-----------+-----+--------------+---…

|  id | select_type | table  | partitions | type | possible keys | key…

|   1| SIMPLE    |company| NULL   |range| idx_name    |8…

+----+------------+-------+-----------+-----+--------------+---…

1 row in set, 1 warning (0.00 sec)

mysql> explain select*from company where name like ' micros%' ;

这里like语句与之前的形式相比只是 type 值改变,从 ref 变为 range,所以这两种查询写法效果是一样的,以上就是前缀索引,可以通过前缀,快速的匹配出数据,从而提高检索的效率。比如插入数据,然后进行查找 micros 字段数据,rows 扫描数据为两条:

mysql> insert into company values (1004, ' microalibaba') ;

Query OK, 1 row affected (0.00 sec)

mysql> explain select from company where name like 'micros&';

+----+------------+-------+-----------+-----+--------------+---…

|  id | select_type | table  | partitions | type | …| rows…

|   1| SIMPLE    |company| NULL    |range| …|   2…

+----+------------+-------+-----------+-----+--------------+---…

1 row in set, 1 warning (0.00 sec)

这就是前缀索引的功能,主要是为了节省存储空间,就是如果不想占用太大的存储空间,又想使用这个索引,那么就可以这样做,前面也讲过,如果不用索引的话就可以删除,如:

mysql>show indexes from company;

mysql> drop index idx_name on company;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0 Warnings : 0

删除后再进行查看,可以看到扫描为4行,type 为 ALL:

mysql> explain select*from company where name like ' microt %' ;

+----+------------+-------+-----------+-----+--------------+---…

|  id | select_type | table  | partitions | type | …| rows…

|   1| SIMPLE    |company| NULL    | ALL  | …|   4…

+----+------------+-------+-----------+-----+--------------+---…

1 row in set, 1 warning (0.00 sec)

所以对于不用的索引要及时的删除,因为在更新这个表的时候会进行维护索引,要负责索引做更新,这是他的特点,应该将他删除。

 

三、全文索引

1、定义

于全文索引,什么是全文索引,主要解决什么问题,首先要了解在很多情况下使用 like 关键字或者正则表达式去进行模糊查询的时候,会进行对表,进行全表的扫描,就像前后都有百分号,如: ' %microt %',这种情况的检索效率很低,所以可以通过全文索引去提高字符串的检索效率简单来说,MySQL 中的全文索引,主要是用来使用一种特定的分值计数,而在利用查询的关键字和查询的字段内容相关度进行检索,通过全文索引可以提高文本匹配速度,所以需要注意是根据全文检索的关键值和查询内容字段进行相关度的匹配。就比如一些浏览器输入关键字,然后根据关键字快速的检索结果。

(1)分词。全文索引首先会进行分词,对于要检索的文本一个段落,或者一篇文章,首先会进行切分,然后根据切分后的关键词进行匹配。

(2)FULLTEXT 索引仅可用于 MyISAM 表;就是早期 FULLTEXT 索引只支持 MyISAM表,但是在5.6的版本开始支持 Innodb 全文索引。

(3)可以从 CHAR、VARCHAR 或 TEXT 列中作为 CREATE TABLE 语句的一部分被创建,或是随后使用 ALTER TABLE 或 CREATE INDEX 被添加。

2、演示

下面可以看一个例子:

首先创建一个表,如:

mysql> create table book (

-> isbn char (20) primary key,

-> name char (100) not null,

-> brief int roduction text not null,

-> price decimal (6,2)

-> publish time date not null,

-> unique index isbn_unique (isbn),

-> index name_index (name (20) ),

-> index complex index (price , publish time)

-> );

Query OK, 0 rows affected (0.04 sec)

然后写入数据,如:
mysql> insert into book (isbn, name,brief_introduction, price, publish time)

-> insert into book_noindex(isbn, name,brief_introduction,price, publish time) values

-> (‘978-7-115-25626-3’…

然后进行查询:

mysql> select*from book;

| isbn | name | brief_introduction | price | publish_time |

可以查看到插入了三条数据,此时再进行查询,首先会想到使用like进行查询,如下查询 practices,可以看到查询数据为一条:
mysql> select * from book where name like '%practices%' or brief_introduction like ' %practices%'

| 978-7-115-25626-3 |PHP Fundamentals & Practices | Web Database Applications MySQL offers web developers a mixture of theoretical and practical information on creating web database applications. | 42. 00 | 2012-07-01|

然后进行 explain 详解,可以看到扫描了全表的行,所以是进行了全表的扫描,这种做法是不建议的,如:

mysql> explain select * from book where name like '%practices%' or brief_introduction like ' %practices%'

|  id | select_type | table  | partitions | type | …| rows…

|   1| SIMPLE     |book   | NULL    | ALL  | …|   3…

而如果要不加%就要可以利用全文索引,如下 match 中是字段,加上关键词against:

mysq1> select*from book where match(name,brief _introduction) against( practices') ;

ERROR 1191 (HY000) : Can't find FULLTEXT index matching the column list

此时会出现报错为没有全文索引,因为前面没有创建全文索引,所以要进行创建,指令如下:

mysql> create fulltext index brief fulltext on book (name, brief int roduction) ;

Query OK, 0 rows affected, 1 warning (0.19 sec)

Records: 0  Duplicates:0  Warnings: 1

然后再次进行查询则查询成功,并且 explain 详解显示为使用的是全文索引,并且扫描行数为一行,如:

mysql> explain select*from book where match(name,brief _introduction) against( 'practices') ;

|  id | select_type | table  | partitions | type   | …| rows…

|   1| SIMPLE     |book   | NULL    | fulltext | …|   1…

下面进行查询 mysql 关键字也是相同:

mysql> select*from book where match(name,brief _introduction) against( 'mysql') ;

可以看到3条数据均被查询出。

以上就是全文索引的用法。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库索引的数据结构?
MySQL中默认使用B+tree索引,它是一种多路平衡搜索树,具有树高较低、检索速度快的特点。所有数据存储在叶子节点,非叶子节点仅作索引,且叶子节点形成双向链表,便于区间查询。
202 4
|
7月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
9月前
|
关系型数据库 MySQL 数据库
Mysql的索引
MYSQL索引主要有 : 单列索引 , 组合索引和空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过 单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为 ● 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。 ● 唯一索引:索引列中的值必须是唯一的,但是允许为空值 ● 主键索引:是一种特殊的唯一索引,不允许有空值 ● 全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。
|
5月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
148 2
|
6月前
|
存储 关系型数据库 MySQL
MySQL覆盖索引解释
总之,覆盖索引就像是图书馆中那些使得搜索变得极为迅速和简单的工具,一旦正确使用,就会让你的数据库查询飞快而轻便。让数据检索就像是读者在图书目录中以最快速度找到所需信息一样简便。这样的效率和速度,让覆盖索引成为数据库优化师傅们手中的尚方宝剑,既能够提升性能,又能够保持系统的整洁高效。
175 9
|
7月前
|
机器学习/深度学习 关系型数据库 MySQL
对比MySQL全文索引与常规索引的互异性
现在,你或许明白了这两种索引的差异,但任何技术决策都不应仅仅基于理论之上。你可以创建你的数据库实验环境,尝试不同类型的索引,看看它们如何影响性能,感受它们真实的力量。只有这样,你才能熟悉它们,掌握什么时候使用全文索引,什么时候使用常规索引,以适应复杂多变的业务需求。
205 12
|
11月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
735 81
|
10月前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
835 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
8月前
|
SQL 存储 关系型数据库
MySQL选错索引了怎么办?
本文探讨了MySQL中因索引选择不当导致查询性能下降的问题。通过创建包含10万行数据的表并插入数据,分析了一条简单SQL语句在不同场景下的执行情况。实验表明,当数据频繁更新时,MySQL可能因统计信息不准确而选错索引,导致全表扫描。文章深入解析了优化器判断扫描行数的机制,指出基数统计误差是主要原因,并提供了通过`analyze table`重新统计索引信息的解决方法。
242 3

推荐镜像

更多