最详细的mysql索引解析(文末附赠思维导图)(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
全局流量管理 GTM,标准版 1个月
简介: 最详细的mysql索引解析(文末附赠思维导图)(二)

2.4 组合索引(单列索引与多列索引)

可以是单列上创建的索到,也可以是在多列上创建的索引。需要满足最左原则,因为select语句的where 条件是依次从左往右执行的,所以在使用select 语句查询时 where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

select * from member where name='zhangsan'and sex='man'and age=20; 
create index XXX index on member(name,sex,age);
name,sex,age的组合索引顺序必须要和查询的顺序一致才能生效

2.4.1直接创建组合索引

CREATE INDEX 索引名 on 表名(字段1,字段2,字段3);
 mysql> create index name_cardid_phone_index on member(name,cardid,phone);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table member\G;
*************************** 1. row ***************************
       Table: member
Create Table: CREATE TABLE `member` (
  `id` int(10) NOT NULL DEFAULT '0',
  `name` varchar(10) DEFAULT NULL,
  `cardid` int(18) DEFAULT NULL,
  `phone` int(11) DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  `remark` text,
  PRIMARY KEY (`id`),
  KEY `name_cardid_phone_index` (`name`,`cardid`,`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


2.4.2修改表方式创建组合索引

ALTER TABLE 表名 ADD INDEX 索引名 (列名1,列名2);
mysql> alter table member1 add index name_phone_cardid_index(name,phone,cardid);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table member1\G;
*************************** 1. row ***************************
       Table: member1
Create Table: CREATE TABLE `member1` (
  `id` int(10) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `cardid` int(18) DEFAULT NULL,
  `phone` int(11) DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  `remark` text,
  KEY `name_phone_cardid_index` (`name`,`phone`,`cardid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


2.4.3 创建表的时候指定组合索引

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

注意:使用的时候要注意 where 的最左原则

select * from 表名 where 字段1=值 and 字段2=值 and ....;

2.5 全文索引(FULLTEXT)

适合在进行模糊查询的时候使用可用于在一篇文章中检索文本信息。在MySQL5.6版本以前FULLTEXT 索引仅可用于MyISAM引擎,在5.6版本之后innodb引擎也支持FULLTEXT索引。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。每个表只允许有一个全文索引。


2.5.1 直接创建全文索引

create fulltext index 索引名 on 表名 (字段);
mysql> alter table member engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> create fulltext index remark_index on member(remark);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table member\G;
*************************** 1. row ***************************
       Table: member
Create Table: CREATE TABLE `member` (
  `id` int(10) NOT NULL DEFAULT '0',
  `name` varchar(10) DEFAULT NULL,
  `cardid` int(18) DEFAULT NULL,
  `phone` int(11) DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  `remark` text,
  PRIMARY KEY (`id`),
  KEY `name_cardid_phone_index` (`name`,`cardid`,`phone`),
  FULLTEXT KEY `remark_index` (`remark`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)



2.5.2 修改表的方式创建索引

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名); 
 mysql> alter table member1 engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> alter table member1 add fulltext remark_index (remark);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table member1\G;
*************************** 1. row ***************************
       Table: member1
Create Table: CREATE TABLE `member1` (
  `id` int(10) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `cardid` int(18) DEFAULT NULL,
  `phone` int(11) DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  `remark` text,
  KEY `name_phone_cardid_index` (`name`,`phone`,`cardid`),
  FULLTEXT KEY `remark_index` (`remark`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


2.5.3 创建表的时候指定全文索引

CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));

2.5.4 使用全文索引查询

#插入数据测试
mysql> insert into member values(1,'zhangsan',123123,123123,'nanjing','this is vip');
mysql> insert into member values(2,'lisi',123123,123123,'suzhou','this is vvip');
mysql> insert into member values(3,'wangwu',123123,123123,'wuxi','this is vvvip');
mysql> select * from member;
+----+----------+--------+--------+---------+---------------+
| id | name     | cardid | phone  | address | remark        |
+----+----------+--------+--------+---------+---------------+
|  1 | zhangsan | 123123 | 123123 | nanjing | this is vip   |
|  2 | lisi     | 123123 | 123123 | suzhou  | this is vvip  |
|  3 | wangwu   | 123123 | 123123 | wuxi    | this is vvvip |
+----+----------+--------+--------+---------+---------------+
3 rows in set (0.00 sec)
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');


2.6查看索引

show index from 表名;  
show keys from 表名;
mysql> show index from member\G;
*************************** 1. row ***************************
        Table: member
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: member
   Non_unique: 1
     Key_name: name_cardid_phone_index
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: member
   Non_unique: 1
     Key_name: name_cardid_phone_index
 Seq_in_index: 2
  Column_name: cardid
    Collation: A
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 4. row ***************************
        Table: member
   Non_unique: 1
     Key_name: name_cardid_phone_index
 Seq_in_index: 3
  Column_name: phone
    Collation: A
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 5. row ***************************
        Table: member
   Non_unique: 1
     Key_name: remark_index
 Seq_in_index: 1
  Column_name: remark
    Collation: NULL
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
5 rows in set (0.00 sec)

字段

含义

Table

表的名称

Non_unique

如果索引不能包括重复词,则为0;如果可以,则为1

Key_name

索引的名称

seq_in_index

索引中的列序号,从1开始

column_name

列名称

collation

列以什么方式存储在索引中。在 MySQL中,有值’A(升序)或 NULL(无分类)

Cardinality

索引中唯一值数目的估计值

sub_part

如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL

Packed

指示关键字如何被压缩。如果没有被压缩,则为NULL

Null

如果列含有NULL,则含有YES。如果没有,则该列含有NO

lndex_type

用过的索引方法(BTREE,FULLTEXT,HASH,RTREE)

comment

备注

2.7 删除索引

2.7.1 直接删除索引

DROP INDEX 索引名 ON 表名;
 mysql> drop index name_index on member;


2.7.2 修改表方式删除索引

ALTER TABLE 表名 DROP INDEX 索引名; 
 mysql> alter table member drop index phone_index;


2.7.3 删除主键索引

ALTER TABLE 表名 DROP PRIMARY KEY; 
 mysql> alter table member drop primary key;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> desc member;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | int(10)     | NO   |     | 0       |       |
| name    | varchar(10) | YES  | MUL | NULL    |       |
| cardid  | int(18)     | YES  |     | NULL    |       |
| phone   | int(11)     | YES  |     | NULL    |       |
| address | varchar(50) | YES  |     | NULL    |       |
| remark  | text        | YES  | MUL | NULL    |       |
+---------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)



总结


1.索引 有什么 作用 ?


加快查询速度,字段排序

副作用:占用额外的磁盘空间,插入或修改索引字段时会花费更多时间消耗更新性能,因为索引也会随之改变


2.如何提高查询速度?

索引包含着对数据表里所有记录的引用指针,使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。


3.select 语句 慢查询 问题

explain select … 分析一下 这个 select语句是否有用到索引或者索引是否正确,如果没有用索引或者索引用的不正确,可以使用 create index 或者 alter table 表名 add index 添加索引去优化查询速度


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
77 9
|
6天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
32 8
|
11天前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
|
11天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
41 5
|
1天前
|
存储 关系型数据库 MySQL
【MYSQL】 ——索引(B树B+树)、设计栈
索引的特点,使用场景,操作,底层结构,B树B+树,MYSQL设计栈
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
81 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
65 0
|
2天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多