浅谈SQL优化入门:2、利用索引

索引是众所周知的可以提高查询的速度,且针对的是具体的字段,使用方式为:
(MySQL中,一般建立主键,数据库会自动建立其聚集索引;而其他字段的索引,若不具体指明则建立非聚集索引)
(也可以通过关键字 CLUSTERED 或 NONCLUSTERED 指定聚集索引或非聚集索引,因为本篇不涉及具体应用案例,故不展开)
在这里插入图片描述

1、索引

1.1 索引的概念
我们在数据库查询过程中,即使满足给定条件的记录很少,也需要把整个表关系扫描一遍,当关系非常大时,其开销是很大的。

例如,在电影表中查询迪斯尼公司2000年制作的电影:
在这里插入图片描述
假设电影表中有10000条记录,其中2000年制作的电影有200个,这之中制作公司为迪斯尼的只有10个。如果不采取措施,要实现该查询,我们就要把10000个记录都挨个进行检查是否满足条件。如果有某种方法能让我们只取出年份为2000年的200条记录,然后再去找制作公司为迪斯尼的,显然效率要高很多。

确实有这样的方法,就叫做索引,它是一种为表中的给定字段提供存取路径的数据结构。

所以什么是索引?上面这个解释完全不明白,我们还是形象一点说明如下:
(图书按照书名的字母顺序放在对应的字母书架上,就像创建聚集索引,即表中的所有行会在文件系统上根据书名进行物理排序,当查询表中任一行时,数据库首先使用聚集索引找到对应的数据页,就像首先找到对应的字母书架一样;然后按顺序就可以找到目标行,就像找到书架上的书一样)
(在一个表上只能创建一个聚集索引,就像书只能按一种规则摆放一样)
(这就好像你给book表增加了索引bookName,但除此之外没有建立其它索引,当使用bookAuthor进行检索时,数据库引擎又只要进行全表扫描,逐个寻找)
1.2索引的类型
1.2.1 聚集索引

所谓聚集索引,就是确定表中数据的物理顺序,如上面图书的按书名排列,又或者手机电话簿的联系人按姓氏排列等。它规定了数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。也就是,索引存储顺序和数据行的存储顺序是一致的。

1.3.2 非聚集索引
我们说聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,所以在物理上它就没有所谓的顺序可言,也和物理存储顺序无关。

2、汉语字典的例子

如果你还不明白关于“聚集索引和非聚集索引的区别”,这里还有一个形象的例子:

1)聚集索引
汉语字典,其正文本身就是一个聚集索引。

比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字。

同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,你不需要再去查其他目录来找到您需要找的内容。正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

2)非聚集索引
如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。

但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

3、简单总结

索引可以提高查询效率
聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续

另外,众所周知的是,索引确实可以提高查询速度,但会影响插入、删除和更新的效率,正是因为数据变化的同时,索引也必须进行更新维护,消耗性能。所以不能盲目地创建索引,而是合理地创建和使用。

另外的另外,索引这部分的坑还是很深的,比如说如果是按照学分查找60-90之间的学生,那么在学分上创建有顺序的聚集索引是否是最优选择?又或者,如何正确使用聚集索引和非聚集索引?等等类似的问题,都涉及到索引的细节和深度理解。

整体来说这次体验有几个点,关于SQL优化的总结:
尽量使用显性连接
多利用EXPLAIN查看SQL执行顺序
使用小的结果集驱动大的结果集
合理使用索引

参考:https://www.cnblogs.com/deng-cc/p/7405360.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值