索引的原理与作用,各种书籍和网络上的介绍可以说是铺天盖地,基本上主流数据库系统的也都是一致的。选择索引字段的原则,比如外键字段、数据类型较小的字段、经常用于查询或排序的字段、表关联的字段等等,在此不做赘述。本人在工作中见到过很多人创建的索引,回想自己以前也会有理论知识空洞的体会,总感觉理论知识无法与具体的工作问题相匹配。在此仅以工作学习中积累的一点经验和问题场景整理以飨读者。先把常见的注意事项整理如下:
- 索引应该建在选择性高的字段上(键值唯一的记录数/总记录条数),选择性越高索引的效果越好、价值越大,唯一索引的选择性最高;
- 组合索引中字段的顺序,选择性越高的字段排在最前面;
- where条件中包含两个选择性高的字段时,可以考虑分别创建索引,引擎会同时使用两个索引(在OR条件下,应该说必须分开建索引);
- 不要重复创建彼此有包含关系的索引,如index1(a,b,c) 、index2(a,b)、index3(a);
- 组合索引的字段不要过多,如果超过4个字段,一般需要考虑拆分成多个单列索引或更为简单的组合索引;
最后需要提醒的是,不要滥用索引。因为过多的索引不仅仅会增加物理存储的开销,对于插入、删除、更新操作也会增加处理上的开销,而且会增加优化器在选择索引时的计算代价。
因此太多的索引与不充分、不正确的索引对性能都是毫无益处的。一言以蔽之,索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。
举下面一个场景的例子,创建这样的索引是有效的吗?
select *
from t1, t2
where t1.col_1 = t2.ab and t1.col_2 in (12, 38);
-- 创建索引如下
create index idx_t1_query on t1(col_1, col_2);
-- 或者仅创建索引如下
create index idx_t1_col2 on t1(col_2);
再比如,该表最常使用的SQL场景有以下两种类型,应该如何创建索引?
select *
from t1
where t1.PartId = 'xxxx' and t1.STATE = 2 and t1.PROCID = 'yyyy'
select *
from t1
where (t.PartId = 'xxxx' or t1.ActualPartId = 'xxxx' ) and t1.STATE = 2 and t1.PROCID = 'yyyy'
-- 创建一个“全覆盖的索引”,把查询条件都包含的索引
create index idx_t1_query on t1(partId, actualpartId, state, procid);
-- 还是分开创建如下两个索引
create index idx_t1_PartId on t1(partId, state, procid)
create index idx_t1_actualPartId on t1(actualpartId, state, procid)
以执行计划和逻辑IO的统计数据显示,两个场景的测试结果都是后者索引有明显的效果,大家有兴趣可以自己测试验证一下。当然,生产环境远比这些要复杂,各表的数据量及数据分布情况也会影响引擎的执行方式,引擎对索引选择与要求也会不一样,此处仅以简单语句做示例进行说明。
组合索引查询的各种场景:
组合索引 Index (A, B, C)
- 下面条件可以用上该组合索引查询:
- A>5
- A=5 AND B>6
- A=5 AND B=6 AND C=7
- A=5 AND B=6 AND C IN (2, 3)
- 下面条件将不能用上组合索引查询:
- B>5 ——查询条件不包含组合索引首列字段
- B=6 AND C=7 ——理由同上
- 下面条件将能用上部分组合索引查询:
- A>5 AND B=2 ——当范围查询使用第一列,查询条件仅仅能使用第一列
- A=5 AND B>6 AND C=2 ——范围查询使用第二列,查询条件仅仅能使用前二列
- A=5 AND B IN (2, 3) AND C=2 ——理由同上
组合索引排序的各种场景:
组合索引 Index(A, B)
- 下面条件可以用上组合索引排序:
- ORDER BY A ——首列排序
- A=5 ORDER BY B ——第一列过滤后第二列排序
- ORDER BY A DESC , B DESC ——注意,此时两列以相同顺序排序
- A>5 ORDER BY A ——数据检索和排序都在第一列
- 下面条件不能用上组合索引排序:
- ORDER BY B ——排序在索引的第二列
- A>5 ORDER BY B ——范围查询在第一列,排序在第二列
- A IN(1,2) ORDER BY B ——理由同上
- ORDER BY A ASC , B DESC ——注意,此时两列以不同顺序排序
索引合并的简单说明:
- 数据库能同时使用多个索引
- SELECT * FROM TB WHERE A=5 AND B=6
- 能分别使用索引(A) 和 (B);
- 对于这个语句来说,创建组合索引(A,B) 更好;
- 最终是采用组合索引,还是两个单列索引?主要取决于应用系统中是否存在这类语句:SELECT * FROM TB WHERE B=6
- SELECT * FROM TB WHERE A=5 OR B=6
- 组合索引(A, B)不能用于此查询(目前的数据库也很智能,部分OR条件也能够使用组合索引,但效果不是很稳定);
- 很明显,分别创建索引(A) 和 (B)会更好;
- 删除无效的冗余索引
- TB表有两个索引(A, B) 和 (A),对应两种SQL语句:SELECT * FROM TB WHERE A=5 AND B=6 和 SELECT * FROM TB WHERE A=5
- 执行时,并不是WHERE A=5 就用 (A); WHERE A=5 AND B=6 就用 (A, B);
- 其查询优化器会使用其中一个以前常用索引,要么都用(A, B), 要么都用 (A)。
- 所以应该删除索引(A),它已经被(A, B)包含了,没有任何存在的必要。
附,查询指定数据表的索引定义情况:
--Sqlserver:
sp_helpindex 'tableName'
--或者
select t2.name tabName, t3.name indName, t4.name colName, t1.*
from sys.index_columns t1
join sys.tables t2 on t1.object_id = t2.object_id
join sys.indexes t3 on t2.object_id = t3.object_id and t1.index_id = t3.index_id
join sys.columns t4 on t2.object_id = t4.object_id and t1.column_id = t4.column_id
where t2.name = 'tableName'
order by t3.name, t1.index_column_id
--Oracle:
select *
from user_ind_columns a
where a.TABLE_NAME = upper('tableName')
order by a.INDEX_NAME, a.COLUMN_POSITION;
相关推荐
MYSQL 索引注意事项及其优化 索引是 MySQL 中的一种数据结构,可以提高查询效率。但是,索引也需要合理地使用和优化,否则可能会降低查询效率。下面是 MySQL 索引的分类和优化注意事项。 索引分类 MySQL 中的索引...
6. 组合索引策略:合理设计组合索引,确保最常用于搜索的列在索引前列。 7. 注意NULL值:对于允许NULL的列,NULL值不会被包含在索引中,可能影响查询性能。 8. 考虑数据分布:对于数据分布极不均匀的列,索引的效果...
本文档总结了 SQL Server 中索引的使用方法、分类和注意事项,并提供了实践测试的示例代码。 索引的使用目的 索引的使用目的主要是为了提高查询速度和效率。通过创建索引,可以快速地定位到所需的数据,从而减少...
本文将深入探讨数据库方面的注意事项以及如何连接数据库,帮助你更好地理解和应用这些知识。 首先,我们来关注数据库的注意事项: 1. 数据库设计:良好的数据库设计是确保系统高效运行的基础。你需要遵循范式理论...
使用索引的技巧和注意事项: - 索引并非总是有益的,它们会占用磁盘空间,并可能减慢写操作(INSERT、UPDATE、DELETE)。因此,应在频繁查询且数据量大的列上创建索引。 - 对于字符串列,考虑使用前缀索引(如`name...
3. **多条件查询与组合索引**:当查询包含多个条件,如`WHERE a=xxx AND b=yyy`,`WHERE a=xxx ORDER BY b`或`WHERE a=xxx GROUP BY b`,可以创建组合索引来提高效率。组合索引遵循“最左前缀”原则,即查询条件必须...
### Index函数和Match函数必看注意事项 在Excel中,Index函数和Match函数是两个非常实用且功能强大的工具,它们能够帮助用户高效地处理和分析数据。本文将详细介绍这两个函数的基本用法、注意事项以及如何结合使用...
SQL语法优化策略与T-SQL编程注意事项是数据库性能提升的关键环节。优化SQL语句能够显著提高查询速度,减少资源消耗,提升系统整体性能。以下是一些重要的策略和注意事项: 1. **选择性原则**:在`WHERE`子句中,应...
#### 二、索引使用的注意事项 在实际应用中,使用索引还需要注意以下几个方面: 1. **空值处理**:索引中不能包含`NULL`值。如果字段允许为空,那么在设计时应考虑这一点。 2. **索引字段类型**:对于变长字段如`...
"数据库索引那些事(数据库索引原理)" 数据库索引是数据库的一种对象,它保存数据库...数据库索引是数据库查询性能优化的重要手段,它可以提高查询速度、减少 I/O 操作,但是也需要注意索引的使用注意事项和优缺点。
在设计索引时,还有一些其他的注意事项: - 索引的选择性:选择性高的索引(即不同文档中索引字段的值差异大)能提供更好的查询性能,因为它们能更有效地缩小查询范围。 - 多字段索引:创建复合索引(多个字段的...
- **组合索引**: 如果WHERE子句中有多个条件,可以通过创建组合索引来提高查询效率。 - **查询条件的顺序**: WHERE子句中条件的顺序会影响索引的选择和使用,通常情况下,选择性更高的列应放在前面。 - **多表连接**...
MySQL的安装注意事项: 1. 操作系统兼容性:确保你的操作系统与MySQL版本兼容,提前查看官方文档。 2. 硬件需求:根据预期的数据量和访问量,确定合适的硬件配置,如内存大小、CPU速度等。 3. 预先规划数据库架构:...
1. 分布式光伏发电的特点及注意事项 分布式光伏发电系统的容量一般在几千瓦之内,其规模经济效益较低,但小型光伏系统投资回报率并不亚于大型系统。环境效益明显,基本没有噪音污染,无空气和水污染问题。需要在发电...
索引的注意事项: * 频繁更改的列不适合建立索引。 * 字节长的列不适合建立索引。 * 在聚集索引的叶节点中,数据按聚集索引项的值进行物理排序。 * 一个索引可以由多个列(组合索引)组成。 * 一个表只能包含一个...
4. **使用索引优化工具注意事项** - 索引并非越多越好,过多的索引会增加写操作的开销,影响插入、更新和删除的速度。 - 考虑到存储空间:每个索引都需要额外的存储空间,尤其是在大数据量的表上。 - 定期维护:...
【计算机三级(C语言)上机考试题型及注意事项】\n\n计算机三级(C语言)上机考试主要涵盖九种题型,分别为结构体数组排序(11%)、四位数筛选处理(35%)、整数处理(17%)、字符数组替换(18%)、字符串数组排序(6%)...
**使用和维护索引的注意事项:** - 索引会占用额外的存储空间,并且在插入、删除和更新数据时需要维护,这可能会降低写操作的性能。 - 不是所有查询都受益于索引,对于全表扫描或者不使用索引列的查询,索引可能...
#### 四、函数索引的限制与注意事项 ##### 1. 限制 - 函数索引不能用于LOB、REF和嵌套表等数据类型。 - 函数索引不支持某些复杂的表达式组合。 ##### 2. 权限问题 - 创建函数索引通常需要拥有`CREATE INDEX`权限。...
在构建Web应用程序并连接到数据库时,需要注意一系列关键点,以确保数据的稳定访问和安全性。以下是关于这个主题的一些重要知识点: 1. **数据库表名的大小写敏感性**: 在PostgreSQL中,表名默认是不区分大小写的...