Mysql索引入门

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 1.什么是索引?索引是帮助Mysql高效获取数据的一种数据结构 (排好序的快速查找的数据结构)本质上,索引是一种 数据结构索引的目的在于提高查找效率,类比字典MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。


1.什么是索引?


索引是帮助Mysql高效获取数据的一种数据结构 (排好序的快速查找的数据结构)

本质上,索引是一种 数据结构

索引的目的在于提高查找效率,类比字典

MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

注:一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的方式存储在磁盘上🤷‍♂️索引也是需要排序的,并且这个排序的算法和TreeSet一致

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。


2.索引的内部实现方法


在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号

在Mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM中,索引存储在.MYI文件中,在Innodb存储引擎中,索引存储在一个逻辑名称叫做tablespace当中,在MEMORY当中,索引被存储在内存中

不管索引存在哪里,索引都是以一棵树的形态进行存储(自平衡二叉树B-Tree)🧂


3.什么时候适合添加索引?


数据量庞大(根据硬件配置情况而定)此字段经常出现在where后面,以条件的形式存在该字段很少的DML操作(DML操作之后,索引需要重新排序)索引的添加适可而止,请不要没有节制的添加索引字段❌


4.索引的创建和删除创建索引:


mysql> create index temp_ename_index on temp(ENAME);
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc temp;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| EMPNO    | int(4)      | NO   |     | NULL    |       |
| ENAME    | varchar(10) | YES  | MUL | NULL    |       |
| JOB      | varchar(9)  | YES  |     | NULL    |       |
| MGR      | int(4)      | YES  |     | NULL    |       |
| HIREDATE | date        | YES  |     | NULL    |       |
| SAL      | double(7,2) | YES  |     | NULL    |       |
| COMM     | double(7,2) | YES  |     | NULL    |       |
| DEPTNO   | int(2)      | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)


删除索引:explain用于解析执行sql语句😊


mysql> drop index temp_ename_index on temp;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain select * from temp where ename = "KING";
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | temp  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)


5.索引失效


第一式:


select * from emp where ename like '%T';


注意:模糊查询以%开头,不会进行索引查询,此时索引会失效


尽量避免模糊查询以%开头!


第二式:


使用or的情况,必须要求or两边的条件字段都要有索引,否则两边的索引都会失效


尽量少使用or进行查询!🧂


第三式:


使用复合索引查询时,没有使用左侧的列查找,索引会失效


首先介绍一下复合索引的添加方法:


mysql> create index temp_ename_job_index on temp(ename,job);
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0


使用左侧字段进行查找的时候,会使用到索引:


mysql> explain select * from temp where ename = "KING";
+----+-------------+-------+------------+------+----------------------+----------------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys        | key                  | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+----------------------+----------------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | temp  | NULL       | ref  | temp_ename_job_index | temp_ename_job_index | 33      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+----------------------+----------------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)


没有使用左侧的列查找,索引会失效:


mysql> explain select * from temp where job = 'MANAGER';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | temp  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.02 sec)


第四式:


在索引列中参加的运算,索引会失效🤞


第五式:


在where中索引列使用了函数



6.索引分类


单一索引:一个字段中添加了索引

复合索引:两个字段或者更多字段添加索引

主键索引:主键上添加索引

唯一性索引:具有unique约束的字段上添加索引


路遥知马力,索引高级篇见!


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
12天前
|
存储 关系型数据库 MySQL
Mysql索引总结(1)
Mysql索引总结(1)
19 0
|
12天前
|
存储 关系型数据库 MySQL
MySQL 索引的10 个核心要点
MySQL 索引的10 个核心要点
17 0
|
12天前
|
SQL 关系型数据库 MySQL
MySQL8.0索引新特性
MySQL8.0索引新特性
16 0
|
8天前
|
存储 关系型数据库 MySQL
MySQL 8 索引原理详细分析
了解索引的详细原则,不仅有助于优化,能把索引搞清楚的,面试中优势也会很突显。 关于数据库优化的话题,V哥觉得还有很多地方可以聊,如果你有兴趣,欢迎关注一起讨论。
MySQL 8 索引原理详细分析
|
8天前
|
存储 关系型数据库 MySQL
Mysql学习--深入探究索引和事务的重点要点与考点
Mysql学习--深入探究索引和事务的重点要点与考点
|
9天前
|
存储 关系型数据库 MySQL
|
10天前
|
缓存 关系型数据库 MySQL
【专栏】MySQL高可用与性能优化——从索引到事务
【4月更文挑战第27天】本文探讨了提升MySQL性能和高可用性的策略,包括索引优化、查询优化和事务管理。通过合理使用B-Tree和哈希索引,避免过度索引,以及优化查询语句和利用查询缓存,可以改善性能。事务管理中,应减小事务大小并及时提交,以保持系统效率。主从或双主复制可增强高可用性。综合运用这些方法,并根据实际需求调整,是优化MySQL的关键。
|
11天前
|
关系型数据库 MySQL 数据库
【MySQL】数据库索引(简单明了)
【MySQL】数据库索引(简单明了)
|
11天前
|
Java 关系型数据库 MySQL
{MySQL}索引事务和JDBC
{MySQL}索引事务和JDBC
20 0
|
12天前
|
存储 SQL 关系型数据库
MySQL 索引
MySQL 索引
19 0