数据库索引设计及优化

1.表的索引数量不应有上限,只要所有的SQL都能够流畅的运行。

一个页从磁盘读取到数据缓冲池中,一个页包含多条记录,我们可能需要该页上的所有行或一部分行或一行,但花费的成本都相同,约10ms. 在计算领域中, 10ms是一个很长的时间。
10ms怎么计算出来的:排队时间 + 寻道时间 + 半圈旋转时间 + 传输时间
Q:平均排队时间
U: 平均驱动器繁忙度
S:平均服务时间
Q = (u/(1-u))/S

2.SQL处理过程

select * from user where sex = ‘m’ and (weight > 90 or height > 190)
如果一个索引能满足select查询语句所有谓词表达式,那么优化器就可能建立一个高效的访问路径。

过滤因子描述了谓词的选择性,即表中满足谓词条件的记录行数所占的比例,它主要依赖于列值的分布情况。
组合谓词的过滤因子可能比两个谓词过滤因子的乘积要低的多。
对结果集排序要意味着,即使只需要提取一条记录,也必须物化整个结果集。

磁盘及cpu时间的基础假设:
随机读 10ms
顺序读 40Mb/s

顺序扫描的cpu时间
检查一行记录 5us
fetch 100us

select cno, fname from cust where lname = ‘jack’ and city = ‘beijing’ order by fname

如果结果集有1000行,组合谓词lname 和 city做索引,查询花费的时间 1 * 10ms + 1000 * 0.1 ms = 0.1s 。表没有访问,所需的列值都已经复制到索引中了。

星级给定:
一星 : 减少了扫描的范围;
二星:索引的顺序和查询条件的需求一致, 不需要排序操作
三星:索引行包含查询语句的所有列,避免访问表操作

5.索引设计
发现不合适的索引:
1)基本问题法;是否有一个已存在的或者计划中的索引包含where字句所引用的所有列,如果是否,可以考虑将缺少的谓词列加到索引中
2)快速上限估算法;

6.影响索引设计的因素
or操作符和布尔谓词
谓词和其他谓词之间为or操作,那么对于优化器而言,他们也可能是困难的。可行的替代方案有全索引扫描,全表扫描,以及多索引扫描。
好的谓词(BT谓词),只要任何一个简单谓词被判定为不满足条件,那么这一行就可以被排除。
不好的谓词(非BT谓词):仅仅不满足谓词A或仅仅不满足谓词B无法排除一行记录

猜你喜欢

转载自blog.csdn.net/zhanglinlove/article/details/83618300