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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 最详细的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
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
349 9
|
2月前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
341 5
|
3月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
241 3
|
3月前
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
151 2
|
24天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
11天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
86 42
|
2天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
40 25
|
29天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
239 0
|
2月前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
73 3
|
2月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
122 3

推荐镜像

更多