索引覆盖
-
减少I/O次数: 因为通过覆盖索引可以直接获取数据,所以不需要再回表查询,从而减少了I/O次数。 -
提高查询速度: 由于减少了I/O操作,查询速度自然也得到了提高。 -
索引的选择性: 选择性是指不重复的索引值与数据表的总记录数的比值。选择性越高,通过索引筛选出的数据就越少,从而提高了查询效率。
SQL回表
回表的原理
-
非聚簇索引结构: 非聚簇索引的叶子节点存储的是(索引列的值,主键的值)。 -
查询过程: 当使用非聚簇索引进行查询时,首先通过非聚簇索引找到满足条件的主键键值。然后,根据这些主键键值,再回到聚簇索引(主键索引)中查找完整的数据行。
SELECT * FROM users WHERE name='Tom'
时,会发生回表。因为首先会通过name上的非聚簇索引找到满足条件的id,然后再根据这些id回到聚簇索引中查找完整的用户数据。SELECT id, name FROM users WHERE name='Tom'
则不会回表,因为所需的数据都在非聚簇索引中可以找到。索引的最左匹配原则
Leftmost Prefix Rule
) 主要是在使用复合索引(也称为多列索引或多字段索引)时的一个关键概念。这个原则指出,当使用复合索引进行查询时,查询条件应该尽可能地从索引的最左边开始匹配,这样索引才能被有效地使用。last_name
, first_name
)的复合索引,以下查询可以有效地使用这个索引:-
查询基于last_name: SELECT * FROM employees WHERE last_name = 'Smith';
-
查询基于last_name和first_name: SELECT * FROM employees WHERE last_name = 'Smith' AND first_name = 'John';
但是,以下查询则不能有效地使用这个索引(因为它没有包含索引的最左边的列last_name): -
查询仅基于first_name: SELECT * FROM employees WHERE first_name = 'John';
first_name
进行查询,那么你应该创建一个基于(last_name
, first_name
)的索引,而不是基于(first_name
, last_name
)的索引。微信赞赏
支付宝扫码领红包
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。侵权投诉:375170667@qq.com