我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySql索引原理与操作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySql索引原理与操作

1. 什么是索引

索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。

一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。

索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

索引相当于一本书的目录

通过索引查询的方式被称为索引查询。

在 mysql 数据库当索引也是需要排序的,并且这个索引的排序和 TreeSet 数据结构相同。TreeSet(TreeMap)底层是一个自平衡二叉树!在 mysql 当中索引是一个 B-Tree 数据结构。

遵循左小右大原则存放。采用中序遍历方式遍历取数据。

2. 索引的实现原理

MySql索引原理与操作

提醒:

在任何数据库中主键上都会自动添加索引对象,id 字段上自动有索引,因为 id 是主键。另外在 mysql 中,如果一个字段有 unique 约束的话,也会自动创建索引对象。

任何数据库中,然后一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。在 mysql 中,索引是一个单独的对象,在不同的存储引擎以不同的形式存在,

在 MyISAM 存储引擎中,索引存储在一个 .MYI 文件中。在 InnoDB 存储引擎中,索引存储在一个逻辑名叫做 tablespace 的当中。在 MEMORY 存储引擎中,索引存储在内存中。不管索引存储在哪里,索引在 mysql 中都是一个树的形式存在。

MySql索引原理与操作

3. 添加索引的条件

  • 数据量庞大(具体多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
  • 该字段经常出现在 where 的后面,以条件的形式存在,也就是说这个字段总是被扫描。
  • 该字段很少的 DML(insert、delete、update)操作。(因为 DML 之后,索引需要重新排序)

建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。

建议通过主键查询,建议通过 unique 约束的字段进行查询,效率是比较高的。

4. 索引的操作

1. 创建索引

给 emp 表的 ename 字段添加索引,起名:emp_ename_index

mysql> create index emp_ename_index on emp(ename);

MySql索引原理与操作

2. 删除索引

将 emp 表上的 emp_ename_index 索引对象删除

mysql> drop index emp_ename_index on emp;

MySql索引原理与操作

3. 查看一个sql语句是否使用了索引进行检索

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

MySql索引原理与操作

扫描14条记录:说明没有使用索引。type = ALL

mysql> create index emp_ename_index on emp(ename);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain select * from emp where ename = 'KING';
+----+-------------+-------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys   | key             | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ref  | emp_ename_index | emp_ename_index | 43      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+-----------------+-----------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

MySql索引原理与操作

5. 索引的失效

失效的第1种情况:

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

ename 上即使添加了索引,也不会走索引进行查询,为什么?

因为模糊查询匹配中以 “%” 开头了。

尽量避免模糊查询的时候以 “%” 开始。

这是一种优化的手段。

mysql> explain select * from emp where ename like '%T';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |    11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

MySql索引原理与操作

失效的第2种情况:

使用 or 的时候会失效,如果使用 or 那么要求 or 两边的条件字段都要有索引,才会进行索引查询,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会实现。索引这就是为什么不建议使用 or 的原因。

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

MySql索引原理与操作

失效的第3种情况:

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

什么是复合索引?

两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。

mysql> explain select * from emp where job = 'MANAGER';
+----+-------------+-------+------------+------+-------------------+-------------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys     | key               | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+-------------------+-------------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ref  | emp_job_sal_index | emp_job_sal_index | 39      | const |    3 |   100.00 | NULL  |
+----+-------------+-------+------------+------+-------------------+-------------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

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

MySql索引原理与操作

失效的第4种情况:

在 where 中索引列参加了运算,索引失效。

mysql> create index emp_sal_index on emp(sal);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain select * from emp where sal = 800;
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+---------------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from emp where sal + 1 = 800;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

MySql索引原理与操作

失效的第5种情况:

在 where 中索引列使用了函数

mysql> explain select * from emp where lower(ename) = 'smith';
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

MySql索引原理与操作

6. 索引的类型

  1. 单一索引:一个字段上添加索引
  2. 复合索引:两个或多个字段上添加索引
  3. 主键索引:主键上添加索引
  4. 唯一性索引:具有 unique 约束的字段上添加索引

注意: 唯一性比较弱的字段上添加索引用处不大。

相对来说,唯一性越高,效率越高。

到此这篇关于MySql索引原理与操作的文章就介绍到这了,更多相关MySql索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySql索引原理与操作

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL索引原理

定义索引(Index)是帮助MySQL高效获取数据的数据结构。那么什么数据结构可以用来高效的获取数据呢?查看索引mysql> show index from user;+-------+------------+------------------+-----
MySQL索引原理
2020-02-14

MySQL 全文索引的原理与缺陷

MySQL全文索引一种特殊的索引,它会把某个数据表的某个数据列出现过的所有单词生成一份清单。alter table tablename add fulltext(column1,column2)说明: 只能在MyISAM数据表中创建 全文索
2022-05-10

mysql索引底层原理

mysql 索引是一种组织数据结构,用于快速查找和检索数据。其底层实现基于 b+ 树,包括叶节点(包含数据行)和内部节点(引导搜索)。索引类型包括聚簇索引(优化按键值顺序查询)、非聚簇索引(维护指向数据的指针列表)、唯一索引(确保键值唯一)
mysql索引底层原理
2024-08-01

MySQL索引原理详解

目录索引是什么索引数据结构树形索引树的动画为什么不是简单的二叉树?为什么不是红黑树?为什么最终选择B+树 而不是B树水平方向可以存放更多的索引key数据量估算叶子节点包含所有的索引字段叶子节点直接包含双向指针,范围查找效率高Hash 索引更
2022-08-19

Mysql索引基本原理

1.Mysql表空间、段、区、页     在讲索引的概念之前我们先说一下mysql中段区页的概念。     表空间是Mysql数据库存储的最高层,默认情况下InnoDB引擎只有一个表空间,所有的数据都是存放在这个表空间内。     在表空间下数据是以段区页的形
Mysql索引基本原理
2017-03-31

mysql索引原理与用法实例分析

本文实例讲述了mysql索引原理与用法。分享给大家供大家参考,具体如下: 本文内容:什么是索引创建索引普通索引唯一索引全文索引单列索引多列索引查看索引删除索引首发日期:2018-04-14什么是索引:索引可以帮助快速查找数据而基本上索引都要
2022-05-29

MySQL索引优化器工作原理是什么

这篇“MySQL索引优化器工作原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL索引优化器工作原理是什么”文
2022-11-30

PHP与MySQL索引的原理及优化方法

引言:在开发和维护一个功能强大的数据库应用程序时,索引是一个重要的概念,它可以显著提高数据库查询的效率。本文将介绍PHP与MySQL索引的原理和优化方法,并提供一些具体的代码示例。一、索引的原理索引是一种数据结构,它可以帮助数据库引擎快速定
2023-10-21

mysql索引的使用和原理

索引是用于快速查找数据库数据的指针,它基于 b 树结构组织。mysql 支持各种索引类型,包括 b-tree、哈希、全文和空间索引。创建索引对于经常查询的列、连接表的键以及排序和分组的列非常重要。维护索引涉及在数据更改时更新和优化索引,并监
mysql索引的使用和原理
2024-08-01

MySQL索引的原理与优化策略是什么

这篇文章主要介绍了MySQL索引的原理与优化策略是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL索引的原理与优化策略是什么文章都会有所收获,下面我们一起来看看吧。索引的概念MySQL索引是一种用于
2023-07-05

编程热搜

目录