DB2 索引(2)
最近研究了一点DB2索引相关的东西,做一个总结:
(1)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
(2)在经常用连接的列(join)上建索引,这些列主要是一些外键,可以加快连接的速度;
(3)在经常根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;这样查询可以利用索引的排序,加快排序查询时间;
(4)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。当增加索引时,会提高检索性能,但是会降低修改性能
(5)当创建复合索引时,应该考虑这些规则:
(a)在复合索引中,所有的列必须来自同一个表中,不能跨表建立复合列;
(b)在复合索引中,列的排列顺序是非常重要的,因此要认真排列列的顺序,原则上,应该首先定义最唯一的列,例如在(COL1,COL2)上的 索 引与在(COL2,COL1)上的索引是不相同的,因为两个索引的列的顺序不同;
(c)为了使查询优化器使用复合索引,查询语句中的WHERE子句必须参考复合索引中第一个列;
(d)当表中有多个关键列时,复合索引是非常有用的;使用复合索引可以提高查询性能,减少在一个表中所创建的索引数量。
(6) 数据库是有缓存的,性能测试的时候,同一个SQL执行多次的话,除第一次外,后面的结果是缓存的。
(7) 关于select后面的字段是否建立索引一直有误区,这里澄清一下:
select后面的列不用刻意建索引,如果where条件的列或join的列恰好在select后,这些列建索引,则不用回表查询;
如果select后的列不在where条件后,也不是JOIN的条件,建索引是没有用的;
如果select后的列既有索引列也有非索引列,那么必须回表查询。
(8)区分度低的列建立索引没有用:
比如性别;比如软删除标志deleted = 0/1
(9) amount != 0的这种不等于是不走索引的。
(10) 执行计划: 做SQL性能优化,第一步是看执行计划,分析SQL的瓶颈在哪,根据瓶颈进行优化。
(11) 应尽量避免在 WHERE
子句中对字段进行 NULL
值判断,否则将导致引擎放弃使用索引而进行全表扫描