数据库索引的通俗理解

在教科书中,如果我们想阅读某个特定主题,我们只需搜索索引中给出的主题并找到它出现的相应页面。索引是将无序表按顺序排列的方法,这样可以在搜索时最大限度地提高查询效率。

当表未编入索引时,查询必须搜索每一行才能找到符合条件的行。

例如,下表完全无序。

COMPANY_IDUNITUNIT_COST
10121.15
12121.05
14181.31
18181.34
11241.15
16121.31
10121.15
12241.3
1861.34
18121.35
14121.95
21181.36
12121.05
2061.31
18181.34
11241.15
14241.05

如果我们要运行以下查询:

SELECT
	company_id,
	units,
	unit_cost
FROM
	index_test
WHERE
	company_id = 18

数据库必须从上到下一次搜索所有 17 行找到company_id值为 18 的所有实例。

随着表的大小增加,这只会越来越耗时。随着数据复杂性的增加,最终可能发生的情况是一个 10 亿行的表与另一个 10 亿行的表相连;查询现在必须搜索两倍的行,花费两倍的时间。

索引的作用是按排序顺序设置搜索条件所在的列,以帮助优化查询性能。

现在,数据库可以搜索company_id数字 18 并返回该行的所有列,然后移至下一行。如果下一行的comapny_id编号也是 18,那么它将返回查询中行的所有列。如果下一行company_id是 20,则查询知道停止搜索并且查询将完成。

索引导致数据库创建数据结构。数据结构类型很可能是B-Tree。当索引在特定列上创建数据结构时,重要的是要注意没有其他列存储在数据结构中。我们上表的数据结构将只包含company_id数字。units和unit_cost不会保存在数据结构中。数据库索引有存储指针,指针是包含其余信息的行在内存磁盘上的地址。

一个数据库表可以有一个或多个与之关联的索引。

索引太多也有缺点,当必须维护索引以及数据库表时,索引会降低一些插入、更新和删除操作的性能。同样, 索引会占用额外的磁盘空间。

SELECT * FROM emp WHERE last_name = 'Smith'
SELECT * FROM emp WHERE UPPER(last_name) = 'SMITH'

第二个语句不会使用索引,因为 Where 子句包含的 UPPER(LAST_NAME),与索引表达式 LAST_NAME 不匹配。如果您想在所有 Select 语句中使用 UPPER 函数并且您的数据库支持表达式索引,那么您应该使用表达式 UPPER(LAST_NAME) 定义索引

Leave a Reply

Your email address will not be published. Required fields are marked *