MySql索引

MySql的不同存储引擎有着不同的实现方式,本文主要是以innodb引擎来实现。innodb引擎的索引主要是以B+tree树来实现。

索引是一种以空间换时间的方式,对于innodb来说,创建索引,会使原本存储表数据的文件增大。

创建索引一般都是为了进行查询,提高查询效率,所以一般都是配合select语句来使用的。

一、索引失效的情况

MySql的优化一般都是根据索引,然后进行优化,而使用索引,要遵守以下条件,否则索引将会失效。

  1. 最左前缀法则(要注意的是,最左前缀法则在where后面是没有顺序要求,而在order by有顺序要求,因为在order by中,字段在前面和在后面是有区别的,比如,order by math,english和order by english,math 这是两种不同的排序方式)

  1. 使用>或<

  1. 字符串不加引号

  1. or条件一方无索引

  1. 模糊查询%在前面

  1. 表中过滤后,数据仍然很多时。

二、覆盖索引

我们经常能听到别人说,写查询语句的时候,最好不要使用select *。为什么会这么说呢?

其实这跟索引的实现方式有关。索引是以B+tree的形式来实现的,而B+Tree的叶子结点是以链表的形式来进行连接。

假设此时我们有一张student表(主键为id)

聚集索引(主键索引)的B+Tree的叶子结点中存放着id(主键)以及一行的数据,如图:

而正常索引中,叶子结点中存放着对应数据的主键。假设,我们创建一个name字段的索引,name索引的B+Tree的叶子结点的存放着name的信息,以及对应的主键,如图:

我们执行一条select语句,如:select * from student where name = "王五";因为我们为name创建了索引,并且索引也不符合以上六种索引失效的情况,所以name索引是生效的。

通过name索引,我们找到了王五以及它对应的3号主键,但是我们使用的是select *,查询所有的字段,但我们只查到了name,所以我们要根据3号主键回去聚集索引中查找,然后在聚集索引中找到3号的所有数据,并且输出。而回去聚集索引这个表的过程叫做回表查询。

可以看到我们这时是有两个操作的,一个是在name索引查询,一个是在聚集索引查询,这就降低了效率,所以才会说不推荐使用select *

因此,覆盖索引的意思是,select后面的字段,尽量要把我们创建的索引字覆盖,也可以说是尽量要和索引的字段一致。

不过,如果我们执行的语句是select * from student where id = 1;就不一样,因为走的是聚集索引,此时会直接找到一行数据,所以此时的select * 也不会降低效率。

所以,我们使用的是聚集索引,那么使用*也不会有性能降低。但是,如果我们使用的不是聚集索引,那么select后面的字段,要尽量覆盖索引的字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值