Mysql 索引

Mysql 索引

索引存在的目的就是为了加速查询。为了加速查询,索引对数据进行了一系列组织,使数据的存放更有序,类似于书本的目录。也正是因为对数据进行了约束,所以索引会降低更新效率。数据更新时不再是简单的更新数据,而在更新数据之后要将其放在正确的位置。同时索引也会占用磁盘空间。

索引的实现方式

Innodb引擎中索引只有B+树这一种实现方式。为什么选择B+树而不是数组、二叉树、B树,主要是考虑磁盘IO。

Mysql作为一个数据持久化的数据库,所有的数据都是存储在磁盘上的,磁盘的访问性能在计算机的硬件中算是比较慢的,尤其是对于机械硬盘来说,随机访问速度更是慢的离谱,相比较而言,在内存中进行处理速度就快的多。因此想要加速数据查询,首先要做的就是尽可能减少磁盘IO,减少单次查询需要查询的磁盘次数。对于有序数组来说,数据需要进行二分查找,效率与二叉树无异,但是涉及到新增和修改之后的数据移动问题。二叉树在内存中查找效率是log(n),速度很快,但是树的高度也为log(n),如果将树的所有节点存储在磁盘上,则需要访问log(n)次磁盘,当数据量较大时,磁盘访问次数还是太大。

B树和B+树也是搜索树结构,但是相较于二叉树,他们每个节点能够存储多条数据,因此整体树的高度相较于二叉树要低很多。其实树的高度就决定了磁盘访问次数。因此当数据量较大时,B树和B+树的磁盘访问次数要比二叉树少很多,自然效率要更高。

B+树相较于B树有两点优化

  1. 对于单行记录,B树直接存储在所在的节点上,包括叶子节点和非叶子节点。但是B+树只存在叶子节点,非叶子节点只存储一个索引值。假如B树和B+树每个节点的大小一致的话,对于非叶子节点来说,B+树存储的记录行数要比B树多,因此B+树的高度也更低,因此磁盘IO数量也更少,查询效率更高。
  2. B+树的所有叶子节点使用链表结构相连。因此B+树进行范围查询时,只需要查到一个边界值,便可以直接遍历链表查询。而B树则只能挨个查询。

Mysql的Memory引擎,支持在内存中建表。memory引擎的主键索引使用哈希索引。哈希索引单值查询效率高O(1),但是当数据量大时,哈希碰撞严重也会导致查询效率下降,同时哈希索引也无法支持范围查找。

InndoDb中的索引组织形式

Innodb中的索引分为主键索引(聚簇索引)和非主键索引(非聚簇索引)。主键索引的叶子节点存放当前记录的所有字段信息,非主键索引的叶子节点存放索引字段值和主键值。因此假如查询经过非主键索引,需要经过回表的过程,也就是拿到主键值之后去主键索引中查询需要的字段值。Mysql为了减少不必要的回表,当查询所使用的非主键索引中已包含了所需查找的所有字段时就无需回表直接返回。这个过程被称为覆盖索引。在实际应用中尽可能使用覆盖索引也是一种常见的优化手段。

为什么主键一般要求自增

当我们新增数据时,可能会导致B+树节点数据过多而需要将其分裂成两个节点。当我们删除数据时,可能会导致B+树节点数据量过小,而需要与旁边的节点进行合并。如果主键是一直递增的话,当新数据插入时只会将数据写入到最后的叶子节点上,当节点装不下之后开启新的节点,不会涉及到叶子节点的分裂。

同时使用自增数字,一般所占用的位数较小,bigint 8个字节。主键越小,非主键索引的叶子节点就越小,普通索引占用的空间就越小。

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、付费专栏及课程。

余额充值