索引的应用

1. 查询代价估算
总代价 = IO代价 + CPU 代价
       =页面数 * 每个页面读取的时间花费 + 元祖数 * 选择率

2.
全表扫描:读取全部数据页
局部扫描:读取指定位置对应的数据页

3. 单表扫描算法

顺序扫描 seq scan
索引扫描 index scan
只读索引扫描 index only scan

如果选择率的值很大,意味着采取顺序扫描方式可能比局部扫描随机读取方式效率更高,因为顺序IO会减少磁盘头移动的等待时间,如果数据库文件在磁盘上没有碎片或很少,这种方式对性能改善将更为明显

局部扫描,通常采用索引,索引扫描访问的页面可能较少,而且这些页很可能会保存在数据缓冲区,访问的速度会更快。所以对于重复的表的访问,采用索引扫描比较好

4. 实用索引的原则

a. 索引列作为条件出现在Where Having, ON 字句中,这样有利于索引过滤元组
b. 索引列是被连接表(内表)对象且存在于连接条件中。
c. 排序索引
d. 在索引列上求MIN MAX
e. 索引列是 key=常量的格式

a1 加索引

* from table where a1=1 索引扫描
* from table where -a1=-1 顺序扫描, 对索引列做计算,索引不回生效
select a1 from table where a1=1 and a2=3 索引扫描

select a1 from table where a1=1 只读索引扫描
select a1 from table where a1>1 索引扫描

select a1 from table where a1+a3 = 2 顺序扫描, 参与了计算

select * from table where a1<>1 顺序扫描

select a1 from table 顺序扫描
select MAX(a1) from table 索引扫描


FROM A JOIN B ON(a1=b1) 顺序扫描 不符合 key opt 常量的形式

FROM A JOIN B ON(a1=b1) and a1=1;索引扫描

索引列出现在GROUP BY
GROUP BY a1 顺序扫描
where a1 > 1 group by a1 索引扫描
where a3 > 1 group by a1 顺序扫描

索引列出现在HAVING, 与Where 类似
where a3>2 GROUP BY a1 having a1>2 索引扫描

索引列出现在ORDER BY

order by a1 索引扫描
order by a3 顺序扫描

索引列出现在DISTINCT 不生效
selelct distinct a1 from table 顺序扫描

联合索引 a1 a3

where a1=1 and a3=2 索引扫描

实用联合索引的前缀

where a1 =1 索引扫描

使用联合索引的后缀部分  不生效

where a3 = 3 顺序扫描

使用联合索引的全部索引键 但是是 OR 的关系
a1=1 or a3=2 顺序扫描


WHERE 中出现多个索引时, 优选最简单的索引








你可能感兴趣的:(索引)