光一样的少年|「数据库系列」Postgres性能调优——Index
在本文中 , 我们将探讨如何通过使用Explain和Analyze来分析慢查询 , 以及使用索引来修改和增强查询时间来解决慢查询 。
Postgres支持在表上使用各种索引 , 以加快查询速度 。
多列索引多列B树索引可以与涉及索引的列的任意子集的查询条件下使用 。 当(最左边)列有约束时 , 此索引最有效 。 确切的规则是 , 前导列上的相等约束 , 再加上第一列上没有相等约束的任何不相等约束 , 都将用于限制扫描的索引部分 。
Cover索引包含查询所需的所有列的索引 , 该索引位于select语句中 。
唯一索引唯一索引是用于强制列值的唯一性或一个以上列的组合值的唯一性的索引 。
关于索引的最被误解的概念之一是了解在哪里使用主键 , 唯一约束或唯一索引 。 让我们使用一个问题来理解这一点:
问题陈述我们要求没有重复数据的最高性能 。 哪种方法更好?主键 , 唯一约束或唯一索引?
解决方案注意:多个空值不相等 , 因此它们不被视为重复记录 。
- 当表中定义了主键和唯一约束时 , Postgres会在表中自动创建唯一索引 。 这样 , 创建唯一约束将是多余的 , 并且不必要地创建索引会降低Postgres的性能 。 根据Postgres产品团队的建议 , 在表上创建唯一约束 , 然后就无需在这些列上创建唯一索引 。
- Postgres为定义的主键本身创建一个索引 。
- 当我们创建唯一约束时 , Postgres会在后台自动创建索引 。
EXPLAIN ANALYSE SELECT * FROM schemes where scheme_name = 'weekend_scheme'
查询计划| 在方案上使用idx_scheme_name进行索引扫描(成本= 0.28..8.29行= 1宽度= 384)计划时间:0.155 ms执行时间:0.063ms
EXPLAIN ANALYSE SELECT * FROM schemes where lower(scheme_name) = 'weekend_scheme'
查询计划| 对方案进行Seq扫描(成本= 0.00..69.00行= 5宽度= 384)过滤器:(lower((scheme_name):: text)='weekend_scheme':: text)被过滤器删除的行:999规划时间:0.119 ms执行时间:0.721ms
即使我们在处创建了索引scheme_name , 该函数lower也会降低性能 , 因为它会付出额外的努力将所有的值转换scheme_table为小写 。
不使用索引(尽管已定义)的情况 。
- LIKE ‘%scheme’永远不会使用索引 , 但LIKE ‘scheme%’可能会使用索引 。
- where子句中使用的大写/小写函数 。
EXPLAIN ANALYSE SELECT * FROM schemes where lower(scheme_name) = 'weekend_scheme'
查询计划| 方案上的位图堆扫描((cost = 4.32..19.83行= 5宽度= 384))重新检查条件:(较低((scheme_name):: text)='weekend_scheme':: text)对块:精确= 1位图扫描在方案上((cost = 0.00..4.32行= 5宽度= 0))索引条件:(较低((scheme_name):: text)='weekend_scheme':: text)计划时间:1.784 ms执行时间:0.079 ms
- 金戈鐵馬|特朗普力挺铁杆支持者,枪杀两人的少年没错?抗议活动不断发酵
- 光明论|劳动者的尊严不能像证件一样被“扔”在地上
- 少年|央视要搞选秀,热搜沸了!网友提名他当导师,点赞数第一
- 暖夏少年|2020电脑硬盘销量排行榜:七彩虹加入战局,硬是打倒了金士顿
- 少年一梦|2020畅销手机排行,iPhone无人超越,安卓旗舰全线溃败
- 少年帮|进入倒计时,华为突然宣布,供应链将迎来“洗牌”?
- 王者荣耀|没有明世隐的“狼狗”不能玩?正确玩法教给你一样凯瑞全场!
- 像梦一样奔驰|51WDP开发者平台五大工具全面开放,让数字孪生触手可及
- 体育多看|若他留在湖人,能享受和科比一样的待遇吗?,詹姆斯38岁合同到期
- 杨毅|理智看球!杨毅:像威少爷这种,就像没学过打球一样