在一本书中搜索特定主题时,我们将首先访问索引页面(该页面位于该书的开头),并找到包含我们感兴趣的主题的页码。现在,想象一下在没有索引页的书中找到特定主题是多么不方便。为此,我们必须搜索书中的每一页,这非常耗时且令人沮丧。
当SQLSrvr从数据库中检索数据时,它也会出现类似的问题。为了克服这个问题,SQLSrvr还使用索引来加快数据检索过程,在本文中,我们将介绍该部分。我们将介绍为什么需要索引以及如何有效地创建和删除索引。本教程的先决条件是SQL命令的基本知识。
什么是索引?索引是一个架构对象,它使用指针从行中检索数据,从而减少查找数据的I/O(输入/输出)时间。索引可以应用于我们要搜索的一个或多个列。它们将列存储在称为B树的单独数据结构中。B-Tr的主要优点之一是它以排序顺序存储数据。
如果您想知道为什么如果对数据进行排序可以更快地检索数据,那么您必须阅读线性搜索与二分搜索。
索引是提高SQL查询性能的最著名的方法之一。它们体积小、速度快,并且针对关系表进行了显著优化。当我们想要搜索没有索引的行时,SQL会线性执行全表扫描。换句话说,SQL必须扫描每一行才能找到匹配条件,这是非常耗时的。另一方面,如上所述,索引使数据保持排序。
但是我们也应该小心,索引会创建一个单独的数据结构,这需要额外的空间,当数据库很大时,这可能会成为问题。出于良好做法,索引仅对常用列有效,可以避免对很少使用的列使用。以下是索引编制可能有用的一些情况,
行数必须为()。
必需列包含大量值。
必需的列不得包含大量NULL值。
如果我们经常根据特定列对数据进行排序或分组,这将很有帮助。索引快速检索排序后的数据,而不是执行完全扫描。
在以下情况下可以避免索引,
桌子很小。
或者当列的值很少使用时。
或者当列的值频繁更改时。
当优化程序检测到全表扫描花费的时间少于索引表时,也可能不使用索引,即使它存在也是如此。当表较小或列频繁更新时,可能会发生这种情况。
创建示例数据库在开始之前,您必须在PC上设置MySQL工作台才能轻松遵循本教程。您可以参考此YouTub视频来设置工作台。
设置工作台后,我们将创建一些随机数据,从中可以执行查询。
创建表:
--CratatabltoholdthrandomdataCREATETABLEmploy_info(idINTPRIMARYKEYAUTO_INCREMENT,namVARCHAR(),agINT,mailVARCHAR());
插入数据:
--InsrtrandomdataintothtablINSERTINTOmploy_info(nam,ag,mail)SELECTCONCAT(Usr,LPAD(ROW_NUMBER()OVER(),5,0)),FLOOR(RAND()*50)+20,CONCAT(usr,LPAD(ROW_NUMBER()OVER(),5,0),
xyz.