MySQL索引特性(三 )

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL索引特性

四、索引操作

4.1 创建主键索引

方式一


创建表时,直接在对应的字段名后指定primary key


92ac47ef15024070896a41d2550f2007.png


方式二


在创建表的最后,指定某列或某几列为主键索引


f5087807edd04b60a62aefb88d3fa3bb.png


方式三


创建表后,使用alter指令给指定字段添加主键索引


98006e35e35c43febd45227a028e6b5c.png


4.2 创建唯一索引

方式一


在创建表时,直接在对应的字段名后指定unique


d32b02df8d90426f926ae02676a8794f.png


方式二


在创建表的最后,指定某列或某几列为唯一索引


5a03aa0109ad46f7a7bd1a6b247ea229.png


方式三


创建表后,使用alter命令给指定字段添加唯一索引


c4d49f495164448c97a715e02d7d3a34.png


4.3 创建普通索引

方式一


在创建表的最后,指定某列或某几列为普通索引


b71b734960164c79b74aedd404801651.png


方式二


创建表后,使用alter命令给指定字段添加普通索引

101e1fdb5ea244aa8bef48e90df29262.png



方式三


创建表后,使用create命令给指定字段创建普通索引,并指定索引名


a41a0c3ac8c745e78f89f727a18569e6.png


4.4 创建全文索引

全文索引比较常见的案例就是对文章中的词进行搜索,如下面创建一个文章表,表中包含文章的id、文章名称、文章内容,并在创建表的最后通过fulltext给title和body列创建全文索引


e14ea5c2dba9421e8df5d33d35184731.png


向表中插入一些测试数据


8e270ac75bf84d318870ebd3bc4bf0c8.png


若要查询哪些文章中包含database关键字,可通过模糊匹配进行查找


3ffcddac51d940679188d262bde7d05e.png


但这种查找方式并没有用到全文索引,在SQL语句前加上explain,看到key对应的值为NULL,表示这条SQL在执行过程中没有用到任何索引


b2d4dbb736ca469ea65525370857a4e1.png


若要通过全文索引查询,需使用match against进行搜索。这条SQL语句前面加上explain,可以看到key对应的值为title,表示这条SQL在执行过程中用到了索引名为title的索引


5232991989f64afbbe9d386ae4f2be9d.png


注意:


MyISAM存储引擎支持全文索引,而InnoDB存储引擎是在5.6以后才开始支持全文索引

同时使用title和body建立全文索引时,相当于建立了一个复合索引,默认会选择fulltext中的第一个列名作为这个复合索引的索引名,所以这里explain中key对应的索引名为title

由于是title和body共同建立的全文索引,所以若文章中没有出现关键字,但文章名称中出现了关键字则也会被筛选出来(当前示例没有体现出来)

4.5 查询索引

方式一


使用show keys from 表名查询,比如查询articles表中的索引信息



ca3cae56fae5422791979afe978371db.png

Table:表示创建索引的表的名称

Non_unique:表示该索引是否是唯一索引,若是则为0,若不是则为1

Key_name:表示索引的名称

Seq_in_index:表示该列在索引中的位置。若索引是单列的,则该列的值为1,若索引是复合索引,则该列的值为该列在索引定义中的顺序

Column_name:表示定义索引的列字段

Collation:表示列以何种顺序存储在索引中,"A"表示升序,NULL表示无分类

Cardinality:索引中唯一值数目的估计值。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大

Sub_part:表示列中被编入索引的字符的数量,若列只是部分被编入索引,则该列的值为被编入索引的字符的数目,若整列被编入索引,则该列的值为NULL

Packed:指示关键字如何被压缩。若没有被压缩,则值为NULL

Null:用于显示索引列中是否包含NULL,若包含则为YES,若不包含则为NO

Index_type:显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE)

Comment:显示评注

方式二


使用show iindex from 表名查询,比如查询articles表中的索引信息


7e67bd2ee8e9405db1960d1e708bbf26.png


方式三


使用desc 表名查询(信息较为简略)


cfbc17a3078b49f4ba67765d3deb366d.png


4.6 删除索引

创建测试表


创建一个用户表用于测试索引的删除,表中包含用户的id、姓名和邮箱,并将这三列分别设置为主键索引、唯一索引和普通索引


ce752ca3f5944e53a94bd1b72d686c40.png


删除主键索引


alter table 表名 drop primary key

70e60312f7074ddea6b72b7e91f8517e.png


删除非主键索引

alter table 表名 drop index 索引名

236b3b08b0804708a902a979a55f386e.png

drop index 索引名 on 表名


aa1ea2435bcd4f1b80091ff210f27f5a.png

注意:一个表只有一个主键索引,所以在删除主键索引时不用指明索引名,而一个表中可能有多个非主键索引,所以在删除非主键索引时需要指明索引名


4.7 索引创建原则

索引创建的原则如下:


  • 比较频繁作为查询条件的字段应该创建索引
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  • 更新非常频繁的字段不适合创建索引
  • 不会出现在where子句中的字段不应该创建索引
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
25天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
1月前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
61 3
Mysql(4)—数据库索引
|
16天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
82 1
|
27天前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
56 1
|
17天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
47 0
|
28天前
|
监控 关系型数据库 MySQL
mysql8索引优化
综上所述,深入理解和有效实施这些索引优化策略,是解锁MySQL 8.0数据库高性能查询的关键。
29 0
|
1月前
|
SQL 关系型数据库 MySQL
美团面试:mysql 索引失效?怎么解决? (重点知识,建议收藏,读10遍+)
本文详细解析了MySQL索引失效的多种场景及解决方法,包括破坏最左匹配原则、索引覆盖原则、前缀匹配原则、`ORDER BY`排序不当、`OR`关键字使用不当、索引列上有计算或函数、使用`NOT IN`和`NOT EXISTS`不当、列的比对等。通过实例演示和`EXPLAIN`命令分析,帮助读者深入理解索引失效的原因,并提供相应的优化建议。文章还推荐了《尼恩Java面试宝典》等资源,助力面试者提升技术水平,顺利通过面试。
|
1月前
|
关系型数据库 MySQL 数据库
深入浅出MySQL索引优化:提升数据库性能的关键
在这个数据驱动的时代,数据库性能的优劣直接关系到应用的响应速度和用户体验。MySQL作为广泛使用的数据库之一,其索引优化是提升查询性能的关键。本文将带你一探MySQL索引的内部机制,分析索引的类型及其适用场景,并通过实际案例演示如何诊断和优化索引,以实现数据库性能的飞跃。