当前位置:网站首页>【MySQL】 - 索引原理与使用
【MySQL】 - 索引原理与使用
2022-07-26 18:52:00 【羡羡ˇ】
前言
在学习mysql的过程中, 相信大多数同学在建表查询表的时候, 是不了解mysql是如何通过我们给定的条件来找到这些数据的, 其中索引就是快速查找到数据的一个重要特性, 接着我们来介绍
目录
为什么会有索引呢?索引是什么?
mysql存储数据是按页存储的, 也就是一页一页的存储数据 , 如果这时候有1万条数据(假如分10页), 这时我们去查找第9000条数据 , 那么从第一页的第一条数据开始依次往后找, 我们可以看出,这样查找是相当慢的, 但如果这时候有一个页码, 9000条对应第9页, 我们可以从第9页开始找, 这样效率是不是高了很多
但是我们这里说的索引不像数组里的索引, 这里的索引是一种数据结构(InnoDB引擎采用B+树), 帮助我们高效获得数据, 所以数据库不仅单单存储数据, 还维护了这样一种数据结构帮助我们快速获得这些数据
索引的优势与劣势
优势
索引的优势很明显, 加快了我们获取数据的速度, 提高效率, 降低了数据库IO的成本 , 可以通过索引列对数据进行排序, 降低数据排序的成本, 降低了CPU的消耗
劣势
这里的索引是一种数据结构, 也就意味着我们需要单独去维护这样的数据结构, 所以索引增大了开销 , 并且如果我们对数据进行写操作(增加删除修改)的时候, 索引也是会产生变化的, 那么此时不但需要维护数据, 也要维护索引
所以我们一般根据实际情况来决定索引的使用
索引的分类
mysql根据我们不同的需求定义了不同的索引类型
主键索引
当我们设定表中某一字段为主键时, 数据库会自动建立索引, 主键作为表的唯一标识, 用来建立索引是很合适的
ALTER TABLE 表名 add PRIMARY KEY 表名(列名);
-- 删除建主键索引:
ALTER TABLE 表名 drop PRIMARY KEY ;单值索引
一个索引只包含单个列, 一个表可以有多个单值索引, 当然除了主键外, 我们也可以通过表的其他字段来创建索引
-- 创建单值索引
CREATE INDEX 索引名 ON 表名(列名);
-- 删除索引:
DROP INDEX 索引名;唯一索引
唯一索引也是相对于列来说的, 但是它要求此列的数据是不能重复的, 可以为null
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
-- 删除索引
DROP INDEX 索引名 ON 表名;组合索引(复合索引)
一个索引包含多个列, 它的创建开销更小, 相对于单值索引, 一般在表中数据很多时使用组合索引(表中行数远大于索引列数目)
-- 创建复合索引
CREATE INDEX 索引名 ON 表名(列 1,列 2...);
-- 删除索引:
DROP INDEX 索引名 ON 表名;组合索引最左前缀原则
在使用组合索引时, 需要满足这样一个原则 : 在使用组合索引的列作为条件时,必须要出现最左侧列为条件,否则组合索引不生效.
示例如下 : 表中有 a,b,c 3 列,为 a,b 两列创建组合索引
列如 select * from table where a=’’and b=’’索引生效
select * from table where b=’’and a=’’索引生效
select * from table where a=’’and c=’’索引生效
select * from table where b=’’and c=’’索引不生效
全文索引
当我们使用模糊查询时, 使用like时, 这时一般索引时无效的, 这时我们需要使用全文索引
-- 创建全文索引
CREATE FULLTEXT INDEX 索引名 ON 表名(字段名) WITH PARSER ngram;
-- 模糊查询
SELECT 结构 FROM 表名 WHERE MATCH(列名) AGAINST(搜索词')索引的创建原则
认识了索引的特性之后, 那么试想, 在哪种情况下我们需要使用索引, 或者不使用索引呢 ?总结如下
需要索引
首先主键是自动建立唯一索引的 , 另外频繁作为查询条件的字段也应该去创建索引(where后跟的语句) , 查询中与其他表关联的字段, 外键关系创建索引, 查询中排序, 分组的字段, 这些排好序,分好组的字段通过索引查找更加高效
不需要索引
表中数据少的表, 表中的数据如果很少, 那么我们完全没有必要使用索引, 再一个就是频繁增删改的表, 我们在对数据进行写操作的时候, 索引也是会发生变化的, 所以这样维护起来反而影响了效率 . where条件后用不到的字段不创建索引, 数据重复并且分布均匀的表, 数据列重复, 建立索引并没有太大效果
索引的数据结构
mysql默认的存储引擎是InnoDB, 它采用B+树作为索引实现的数据结构
Mysql 索引使用的是 B+树,因为索引是用来加快查询的,而 B+树通过对数据进行排序所以是可以提高查询速度的,然后通过一个节点中可以存储多个元素,从而可以使得 B+树的高度不会太高.并且叶子节点之间有指针,可以很好的支持全表扫描,范围查找等 SQL 语句。

聚簇索引与非聚簇索引
聚簇索引
聚簇索引指的是 : 找到索引就找到了数据, 主键就是聚簇索引
非聚簇索引
非聚簇索引指的是 : 先找到索引, 此时并没有找到数据, 因为索引和数据是单独存放的, 找到索引后我们需要根据索引的信息再次回表查询, 才能找到需要的数据, 也叫做辅助索引
对此举例说明如下 : 建立学生表
CREATE TABLE student (
id BIGINT,
NO VARCHAR (20),
NAME VARCHAR (20),
PRIMARY KEY (`id`),
UNIQUE KEY `idx_no` (`no`)
)接着我们做三种查询 :
1. 通过主键获取数据, 因为主键是唯一标识, 所以可以根据主键直接获取全部数据, 是聚簇索引
2. 根据编号查询编号和名称 , 编号本身是一个唯一索引,但查询的列包含了学生编号和学生名称,当命中编号索引时,该索引的节点的数据存储的是主键 ID,需要根据主键 ID 重新查询一次,所以这种查询下 no 不是聚簇索引
3. 根据编号查编号(判断编号是否存在) , 这种情况下, 直接返回编号,因为所需要的数据就是该索引,不需要回表查询,这种场景下 no 是聚簇索引。
在mysql的默认存储引擎InnoDB中, 数据和索引是存放在一起的, 是聚簇式设计(但其用到非聚簇索引), 而在MYISAM引擎中, 数据和索引是单独存放的, 是非聚簇设计
边栏推荐
- 金仓数据库 KingbaseES SQL 语言参考手册 (19. SQL语句: DROP TABLE 到 LOAD)
- How to write the test case of mobile app? What are the mobile app test points?
- The authentication type 10 is not supported
- 通过源码深度分析线程池中Worker线程的执行流程
- IM即时通讯开发如何压缩移动网络下APP的流量消耗
- canvas概述
- 知识管理系统是什么?你需要知道这些
- openstack 虚拟机网卡被重名为cirename0
- Using MySQL master-slave replication delay to save erroneously deleted data
- Selenium + case of Web Automation Framework
猜你喜欢

工作13年后,个人的一点软件测试经历及感想……

线性代数第4章线性方程组

Software process that testers must know

Solidity中call函数详解

Leetcode daily practice - 88. Merge two ordered arrays
![[MySQL must know and know] log details](/img/68/0c32ae42bfa013d10310ab67b1de58.png)
[MySQL must know and know] log details

基于ABP实现DDD--领域逻辑和应用逻辑

上半年住户存款增加10.33万亿元,平均每天约571亿存款涌向银行

After working for 13 years, I have a little software testing experience and feelings

企业内部信息碎片化该怎么办?不妨试试这样做
随机推荐
DDL, DQL, DML statements
手机app测试用例怎么写?手机app测试点有哪些?
学习Muduo中ChatRoom实现的各种细节和思考
【实习经验】异常处理与访问url结果响应数据处理
Pychart loads CONDA to create a pytorch virtual environment and reports an error. It is normal on the CONDA command line
All you want to know about interface testing is here
Summary of iPhone development data persistence (final) - Comparison of five data persistence methods
[shell] Reprint: batch replacement find awk sed xargs
Using MySQL master-slave replication delay to save erroneously deleted data
[MySQL must know and know] log details
线性代数第3章向量
Detailed explanation of Yolo V2
浅析接口测试
工作13年后,个人的一点软件测试经历及感想……
DOM案例:10秒倒计时-写跳转页面相关的知识
MySQL 子查询使用方式
原 iOS面试题收集
Adjust the array order so that odd numbers precede even numbers and their relative positions remain the same
How to compress the traffic consumption of APP under mobile network in IM development
金仓数据库 KingbaseES SQL 语言参考手册 (13. SQL语句:ALTER SYNONYM 到 COMMENT)