大部分开发会了解这样的《开发规范》:创建索引要选择区分度高的字段。他们会认为区分度低的字段不适合创建索引或者不适合添加到组合索引里面。但是这样的 *** 作会导致很多慢查。举例来说:
select * from tab where a=1 and b=2
场景 1
符合 a=1的记录数有 10w 条记录 ,b=2 有 1000 条记录。如果只是创建idx_a(a),sql 请求通过索引idx_a访问 10w 条件记录,然后还要逐一匹配 10w 条记录中的 status,找到符合 b=2的记录。这个动作会导致慢查。如果创建组合索引idx_ab(a,b),sql 请求通过索引idx_ab可以直接定位到 1000 条记录,无需额外的过滤。这样减少访问 9900 条记录的时间,提升查询速度。
场景 2
符合 a=1的有 100 条记录,status=2 有 10 条记录。其实场景 2 因为数据量比较少,直接访问 100 条记录和定位到 10 条记录的时间消耗相差不大,量变不足以引发质变,可以忽略了。
Tips:
创建索引的目的是通过索引尽可能找到匹配 where 条件的行,减少不必要的回表,提高查询效率;
需要辩证地看待区分度比较低的字段在组合索引中的作用。在组合索引的情况下,我们不能只是单纯地看字段的区分度,而是要看符合条件的记录数是多少。符合条件的记录越少,性能越好。
一、SQL创建索引的目的如下:
1、通过唯一性索引(unique)可确保数据的唯一性;
2、加快数据的检索速度;
3、加快表之间的连接;
4、减少分组和排序时间;
5、使用优化隐藏器提高系统性能。
二、创建SQL索引的语法:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED](索引类型) INDEX <索引名>ON <表名>(<列名>[ASC|DESC] [, <列名>[ASC|DESC]...])。
扩展资料:
索引的类别介绍:
1、唯一索引:
唯一索引是不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。
2、主键索引:
数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
参考资料来源:百度百科-索引
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)