MySQL:从什么是索引,到运用索引(程序员进阶)

什么是索引?

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。

可以通俗的反过来理解索引:

你要看某一本书里的某一章节里的内容,如果没有目录的话,你是不是要从头开始看着找呢,如果恰巧你想要看的章节内容又是在最后的那几页,你是不是要把书看着翻到最后呢,这效率甭想也知道很低,如果有了目录那就好办多了,你要看书里的某一内容,不用从头翻一遍,你按着目录里的章节去找对应内容就好了。

技术光谈理论不实践都是耍流氓,那么我们来看看具体有哪些索引和对索引的操作

  • 单值索引—— 即一个索引只包含单个列,一个表可以有多个单列索引。
  • 唯一索引—— 索引列的值必须唯一,但允许有空值。
  • 复合索引—— 一个索引包含多个列。
  • 全文索引—— 只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引

在做索引之前我们先创建足够多数据,这样才能更好的看到索引效果,那么可以用上我们的存储过程创建300万条数据来玩(记住是300百万条不是3000万条,注意不要多个0,不然真的有得等,上一篇文章翻过车,说多都是泪,我放下面了,这里就不赘述)

教你使用MySQL仅调用一个存储过程创建三千万条数据

你看创建300百万条数据也要9分钟多,何况3000万条…
在这里插入图片描述

没有建立索引之前,我们根据username查询一下(这里的表结构和数据都可以去看上面链接里的文章,避免有小伙伴想跟着做的无从下手)

SELECT * FROM user WHERE username = '用户_2000000';

运行结果(查一条数据就要差不多3秒,如果用户多了那是不行的)
在这里插入图片描述
那么我们还可以用EXPLAIN关键字分析一下,EXPLAIN是干嘛的呢,它可以用于分析查询语句以及表结构的性能,也可以看是否使用了索引,以及索引的信息。

EXPLAIN SELECT * FROM user WHERE username = '用户_2000000';

运行结果(可以看到在差不多在3000000列…)
在这里插入图片描述
那么来创建一个普通索引

CREATE INDEX idx_user_username ON user(username);

查看索引

show index from user;

运行结果(可以看到除了我们手动建的索引,在表上定义主键后会自动创建对应的唯一索引)
在这里插入图片描述

创建索引后再次查询

SELECT * FROM user WHERE username = '用户_2000000';	-- 再次根据用户查询

EXPLAIN SELECT * FROM user WHERE username = '用户_2000000';	-- 再次查询行

运行结果(加入索引后查询是飞速的)
在这里插入图片描述
看它的排是1
在这里插入图片描述

为什么建立索引会变快呢,这又回到开头说了索引的本质是数据结构,创建索引会让数据从一张表变成一颗B+树,这颗树有个特点,取中间一个数作为根,然后小于它的往左边,大于它的往右边放,以此类推。(当然btree索引的数据结构深入又得是需要一篇文章来谈,如果有机会咱就再写一篇来深入看看B+树的数据结构,这里就不深究,下图是一个简单的展示,方便理解)
在这里插入图片描述

扩展点:

索引的优势与劣势

优势:

  • 上面所说书有了目录,你找对应的内容就快多了,索引也是如此,提高了数据检索效率,降低了IO的成本。
  • 索引对数据进行了排序,降低了数据排序成本,降低了CPU的消耗。

劣势:

  • 实际索引也是一张表,该表保存了主键和索引字段,执行实体表的记录,所以是要占空间的(索引可以说是用空间换取了速度)
  • 索引提高了查询速度,但会降低更新表的速度,例如对表进行INSERT插入、UPDATE修改、DELETE删除。

关于优势和劣势还是那句话,技术是把双刃剑,有好的一面,也会有坏的一面,没有最好的,只有最适合的,关键看你在实践中针对具体业务去运用。

索引结构:

需要注意的是我们索引数据结构还有一个hash的索引,但是我们的数据库因为是InnoDB的所以只支持btree(B树)索引,而hash(哈希索引)只有MyISAM引擎支持。

有哪些情况下需要创建索引?

  • 主键主动建立唯一索引(创建表结构的时候就需要主键)
  • 频繁作为查询条件的字段应该创建索引
  • 查询中与其他表关联的字段,外键关系建立索引
  • 查询排序的的字段,排序字段通过索引再去访问会提高排序速度
  • 查询统计或分组字段

有哪些情况下不需要创建索引?

  • 表数据太少(这么少你也建索引,这不是瞧不起我MySQL吗 ? ? ?)
  • 经常增删改的表
  • 如果某数据列有过多的重复内容,建立所以没有太大实践效果(还是要回到实际需求去创建对应的创建索引)
  • 频繁更新的字段不适合建立索引,因为每次更新不单单是更新了数据,而且还会更新索引(就像书里的目录,你开头都把目录结构建好了,但你内容还老移来移去,你说目录会不会乱)
  • WHERE条件没有用到的字段不用创建索引

最后:

看了理论和实践,在问一句什么是索引,你是不是又会有不同的理解了呢

对索引的的理解

  • 索引用于快速找出某个列中有一特定值的行(在使用中可以看到用WHERE根据特定的值找出对应内容)。
  • 不使用索引那么它必须从第一条数据开始读完整个表,直到找出对应的行。
  • 表越大,查询数据花费的时间就越多。
  • 如果表中查询的列有创建索引,就可以快速到达一个位置去搜索数据,而不必查看所有数据,检索效率自然会提高。

所以技术,不仅是要能运用也要懂理论,更要清楚底层是如何实现的,要知其然也知其所以然在深刻理解之上去创造,才能走得更远。

我是一颗剽悍的种子,一颗偏爱前端的后端新司机。 把我会的认真的分享——一直是我写博客的信条,把文章的知识通通带走,把你的四连留下,点赞、评论、留言、关注是我写博客的最大动力,哈哈

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值