MySQL的索引

B+Tree

引用文章:https://www.cnblogs.com/dongguacai/p/7241860.html

所有数据都保存在叶子节点上。相较于B树,范围查找效率更高。

即MySQL的InnoDB引擎,表中数据都是根据主键的索引顺序存放。

每一个索引在InnoDB中都对应一个B+树。

主键索引

就是建表时候有primary key的字段,比如说id。又叫聚簇索引

这个id字段对应的索引结构大概就这样。最下层的子节点上挂着数据。

二级索引

除了主键索引以外的其他索引。

它和主键索引的区别就是,它的最下层挂的不是数据,而是主键id。比如某个普通索引 a。

大概就这样。

回表

如果基于普通索引所在字段进行条件查询,比如select * from t where a = 30;

这个查询分为两个步骤,

步骤1:先去a字段的索引B+树上找到对应的主键索引位置。

步骤2:再去id的索引树种再查询一次,因为主键索引在子节点中挂着数据,拿到对应的30。

这个过程就是回表。

覆盖索引

如果是换一种SQL写发呢,比如 select id from t where a = 30;

二级索引 a 子节点上挂的就是id的值,所以可以直接把这个id的值 3 拿到,返回给客户端,避免了一次回表。

所以在创建索引的时候,也可以考虑业务场景,查询条件字段和查询结果字段,某些情况下可以创建联合索引。

最左前缀原则

适用于联合索引和普通索引。

比如联合索引 (`a`,`b`),那么select * from t where b = 3; 这种是不会走索引的。只有 select * from t where a=3 ;可以

普通索引,如果是一个varchar类型的,比如字段 `name` ,select * from t where `name` LIKE '王%'是可以走name索引。

如果是select * from t where `name` like '%富贵';这就就不会走name索引。

索引下推

区分MySQL版本,5.6及以后的MySQL有这种优化。

比如一张表有一个普通索引 (`name`,`score`) 和一个主键索引(`id`),其中name字段是varchar类型代表学生姓名,score是int类型代表学生考试分数。

现在要查全校所有姓王的,分数大于60分的学生。

SQL大概是这样:SELECT * FROM `t` WHERE `name` LIKE '王%' AND `score` > 60;

这个SQL的执行过程是什么样呢。

首先查询的是所有字段,那么回表是少不了的了。

先根据索引定位出所有name字段以'王'开头的所有数据,比如有100个,回表100次,到id索引树种找到这些数据,然后比较score字段是不是超过60进行过滤。

索引下推就是对这种查询进行优化。

由于是组合索引,所以在(`name`,`score`)索引上有两列的数据,name和score,就可以在回表之前进行一次过滤。

查询出一批name字段以'王'开头的学生,比如有100个,然后对score字段进行过滤,剩下50个,回表50次,到id索引树种找到这些数据,直接返回客户端。

索引下推总的来说就是减少查询过程中回表的次数。

索引维护

建表建索引时,不光要考虑查询效率,同时也要考虑一下这个字段适不适合作为主键。

如果一张表有一个字段是身份证号,长度18位varchar类型,可以保证唯一性。但是其他的所有索引树的字节点上都要存一份这个身份证号。对于空间无疑是一种浪费。

数据页分裂/合并

比如id的索引的数据页存了 1,2,3,4,6 这5条数据,7,8,9,10,11在下一页。

那么这时如果插入一个12,就会申请一个新的数据页,对原有的索引数据页不会操作。

如果插入的是5,那么就涉及到数据页分裂,需要挪动后边的数据页,这无疑是一种影响效率的操作。

所以一般建主键索引时都会加上自增 AUTO_INCREMENT ,减少页分裂的概率。

页合并,相反于页分裂,就是删除操作时,把某几个数据页的数据合并到一个页上。

 

 

MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值