MySQL索引

1.MySQL索引

1.什么是mysql索引?

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构。
你可以简单理解为"排好序的快速查找数据结构”。

2.索引有几种特性类型?

一个索引包含一个列,一个表可以有多个单值索引

2.2 唯一索引

索引的值必须唯一,但是允许有控制

2.3 复合索引

一个索引包含多个列

😊没用的举例

CREATE INDEX indexName ON table_name (column_name)
ALTER table tableName ADD INDEX indexName(columnName)

在这里插入图片描述

在这里插入图片描述

3.常见的索引的底层是什么?

常见的索引是B+树。

B+实际上是B树的改进,B树是平衡二叉树(AVL树)的改进在这里插入图片描述
B树相对于平衡二叉树每个节点可以存储更多的数据。

更符合数据存储的要求

B+树:B+树实际上是B树的改进,与B树不同,B+数仅仅在叶子节点存储数据,由于磁盘块大小是一定的,单个磁盘块可以存储更多的指针,降低树的高度,叶子节点连续数据的分段读取也更优雅。

在这里插入图片描述

注意:B+树的叶子节点(页)之间是双向链表

总结:1. 数据需要大量查找,且区分度较高的情况下需要建立索引

2.经常需要删除的数据不建议建立索引

😊举个例子: 数据库维护用户表的注销操作的时候为了不影响数据的查找效率,维护索引的完整,经常不真正删除数据,而是采用标记的方式,实现逻辑上的删除

聚簇索引和非聚簇索引的区别
  • MyISAM是非聚簇索引,B+树的叶子节点储存的不是数据,而是数据地址;

  • 主索引和辅助索引没有区别,主索引的key一定要唯一;

  • 主索引的B+树的叶子节点存储了主键,辅助索引的B+树的叶子节点存储了辅助键

  • 表数据存储在单独的位子,两种索引的树叶子节点节点都使用一个地址指向真正的数据

  • InnoDB是聚簇索引,行数据就存在叶子节点

  • 主键查询,直接找到叶子节点,返回数据

  • 非主键查询,先找到主键,然后再根据主键二次查询数据

  • 聚簇索引数据的物理存放顺序和索引顺序是一致的,即,索引是相临的,数据也是相临的,聚簇索引查询效率要比非聚簇索引高效。

  • 聚簇索引 主索引+辅助索引的好处是,数据行变动,主索引会更新,但是辅助索引不需要更新

  • 非聚簇索引,类似于书的目录,

  • 每个表只能有一个聚簇索引,因为一个表的物理顺序是唯一的。

2.MySQL性能分析

1.explain关键字:用于分析sql的运行计划

在这里插入图片描述

2.1.explain关键字:

  1. id:id越大越优先被执行,同样大从上到下执行。总体趋势是被依赖的先执行

  2. select_type:查询的类型

SIMPLE :简单的select查询,查询中不包含子查询或者UNION。
PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为Primary.
DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MysQL会递归执行这些子查询,把结果放在临时表里。
SUBQUERY:在SELECT或wHERE列表中包含了子查询。

  1. table:查询所涉及的表

  2. type:访问类型排序

system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。

Const:表示通过索引一次就找到了, const.用于比较primary key或者unique索引。因为只匹配一行数据,所以很快,如将主键置于where列表中,MySQL就能将该查询转换为
一个常量。

eg_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

Range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索5
一般就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比
全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。

Index: Full Index Scan, index与ALL区别为index类型只遍历索引树。这通常比
ALL快,因为索引文件通常比数据文件小。也就是说虽然all和Index都是读全表,但index
是从索引中读取的,而all是从硬盘中读的。

All: Full Table Scan,将遍历全表以找到匹配的行。

从最好到最差依次是:system>const>eg_ref>ref>range>index>All 一般来说最
好保证查询能达到range级别,最好能达到ref。

5.passible_key:mysql猜测可能使用的索引

里面的索引未必一定会被使用

6.key:实际使用的表中的索引

7.row:文件排序

rows列显示MysQL认为它执行查询时必须检查的行数。一般越少越好。

8.key_len:显示的值为索引字段的最大可能长度,并非实际使用长度

一般越大越好

8:extra

Using filesort: MysQL无法利用索引完成的排序操作称为“文件排序”。
Using temporary: Mysql在对查询结果排序时使用临时表,常见于排序order by和分组查询group by。
Using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。
Using where:表示使用了where 过滤。

2.2. 索引失效举例:

创建复合索引

alter table students add index idx_sname_age_score(sname,age,score
  1. 最佳左前缀法则:如果索引了多列,要遵循最左前缀法则,指的是查询从索引的最左
    前列开始并且不跳过索引中的列。

    explain select * from students where sname="小明" and age = 22 and
    score = 100;
    explain select * from students where sname="小明" and age = 22;
    explain select * from students where sname="小明";
    explain select * from students where sname="小明" and score = 80;
    
  2. 不在索引列上做任何计算、函数操作,会导致索引失效而转向全表扫描。

    explain select * from students where left(sname,2)= "小明";
    
  3. 存储引擎不能使用索引中范围条件右边的列。

     explain select * from students where sname="小明" and age > 22 and
    score = 100;
    
  4. MySQL在使用不等于时无法使用索引会导致全表扫描。

    explain select * from students where sname ! ="小明";explain select * from students where sname is null;I
    
  5. like 以通配符开头会使索引失效导致全表扫描。

    explain select * from students where sname like "%"明;

  6. 字符串不加单引号索引会失效。

    explain select* from students where sname = 123;
    

select * from students where sname like "%"明;

  1. 字符串不加单引号索引会失效。

    explain select* from students where sname = 123;
    

  • 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
发出的红包

打赏作者

只会写bug的靓仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值