1 索引建立常用原则
高离散度:表的某个字段值得离散度越高,该字段越适合选作索引的关键字。
内存占用少:占用存储空间少的字段更适合选作索引的关键字
最左前缀原则
经常修改的不适合做索引
2 索引失效
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于多列索引,不满足最佳左前
3.like查询是以%开头
4.如果使用全表扫描要比使用索引快,则不使用索引
5.数据类型出现隐式转换
3 索引的建立是需要开辟额外的空间,目前大部分索引使用的是B+树,数据的删除和更新都会B+树做一个调整,增加了维护性能,索引的建立必须要考虑其本身的开销。
4 PG数据库常见执行:
1 Seq 扫描: 按照表的记录的排列顺序从头到尾依次检索扫描,每次扫描要取到所有的记录。
2 Index Scan 对于给定的查询,我们先扫描一遍索引,从索引中找到符合要求的记录的位置(指针),再定位到表去取。等于是两次I/O,先走索引,再走取表记录。
3 Bitmap Heap Scan 普通的索引扫描( index scan)一次只读一条索引项,那么一个 PAGE 面有可能被多次访问;而 bitmap scan 一次性将满足条件的索引项全部取出,并在内存中进行排序, 然后根据取出的索引项访问表数据。
4 index only scan 所包含的字段集合,囊括了我们查询语句中的字段,这样,提取出相应的index ,就不必再次提取数据块了
5 小结
1 当查询的数据量较大时候,走索引查询比全表扫描效率低,此时会走全表扫描 一般低于20%会走索引,20~40 可能索引 ,40%一般不会走索引
2 在进行过滤查询时,严格按照最佳左前要求
3 在针对多个索引选择的时候,PGSQL 有一套算法去计算花费值,判断走哪个索引会消耗最