Paw Index Advisor是PawSQL推出的面向数据库应用开发人员和DBA等数据库运维人员的推出的,针对MySQL、PostgreSQL、Openguass等开源数据库系统的自动化、智能化、基于代价的索引推荐工具。

上一篇(索引推荐神器Paw Index Advisor 使用手册- 配置)介绍了Paw Index Advisor的配置项及相关注意事项。本篇介绍Paw Index Advisor的支持语法,及相对应的索引结果。

根据数据库查询优化知识(深入学习SQL优化),我们知道索引的作用有如下三个:

  • 快速定位数据记录(等值条件、范围条件);

  • 避免排序(order by/group by/distinct/union/sort merge join);

  • 避免回表,即只访问索引文件而不访问数据表就可以完成查询操作。

下面详细列出Paw Index Advisor针对不同的语法结构,给出的索引推荐效果,小伙伴们体会一下这个索引推荐神器的强大吧。

  • 等值条件

-- 单列条件
select * from lineitem where l_shipdate = date '1998-12-01';
CREATE INDEX PAW_IDX1533504424 ON LINEITEM(L_SHIPDATE);-- is null
select * from lineitem where l_shipmode is null;
CREATE INDEX PAW_IDX2000792795 ON LINEITEM(L_SHIPMODE);-- in 单值
select * from lineitem where l_shipmode in ('0');
CREATE INDEX PAW_IDX2000792795 ON LINEITEM(L_SHIPMODE);-- 多列条件,区分度大的列放在前面
select * from lineitem where l_shipdate = date '1998-12-01' and l_shipmode = '0';
CREATE INDEX PAW_IDX1942674217 ON LINEITEM(L_SHIPDATE,L_SHIPMODE);-- 单值子查询
select * from lineitem where l_shipdate = (select max(l_shipdate) from lineitem);
CREATE INDEX PAW_IDX1533504424 ON LINEITEM(L_SHIPDATE);
  • 范围条件

-- 范围条件>、<、>=、<=
select * from lineitem where l_shipdate >= date '1998-12-01';
CREATE INDEX PAW_IDX0156881833 ON LINEITEM(L_SHIPDATE);-- in 多值
select * from lineitem where l_shipmode in ('0','1');
CREATE INDEX PAW_IDX2000792795 ON LINEITEM(L_SHIPMODE);-- between ... and ...
select * from lineitem where l_shipdate between date '2010-12-01' and date '2020-12-01';
CREATE INDEX PAW_IDX1241878058 ON LINEITEM(L_SHIPDATE);-- Like 一个左前缀
select * from customer where c_phone like "139%";
CREATE INDEX PAW_IDX0326568991 ON CUSTOMER(C_PHONE);
  • 分组 - 避免排序

-- grouping
select l_shipdate, count(*) as sum_qty from lineitem group by l_shipdate;-- 推荐的索引为
CREATE INDEX PAW_IDX1614428511 ON LINEITEM(L_SHIPDATE); 
  • 排序 - 避免排序

-- order by
select * from lineitem order by l_shipdate limit 10;-- 推荐的索引为
CREATE INDEX PAW_IDX1424903467 ON LINEITEM(L_SHIPDATE);
  • 覆盖索引 - 避免回表

-- index only
select l_shipdate, sum(l_quantity) as sum_qty from lineitem group by l_shipdate;-- 推荐的索引为
CREATE INDEX PAW_IDX1614428511 ON LINEITEM(L_SHIPDATE,L_QUANTITY);
  • 语法组合:等值+范围,等值条件放在前面

-- equal + range
select * from lineitem where l_shipdate = date '1998-12-01' and l_quantity >100;-- 推荐的索引为
CREATE INDEX PAW_IDX2048143506 ON LINEITEM(L_SHIPDATE,L_QUANTITY);
  • 语法组合:等值+分组+覆盖,等值条件放在前面,覆盖列放到最后

-- where+group
select l_shipdate, sum(l_quantity) as sum_qty from lineitem where l_receiptdate = '2020-01-01' group by l_shipdate;-- 推荐的索引为
CREATE INDEX PAW_IDX2000792795 ON LINEITEM(L_RECEIPTDATE,L_SHIPDATE,l_quantity);
  • 多表关联

-- 内连接,两个表都可以作为驱动表
SELECT * FROM ORDERS, LINEITEM WHERE O_ORDERKEY = L_ORDERKEY;
-- 推荐的索引为
CREATE INDEX PAW_IDX2127618499 ON ORDERS(O_ORDERKEY);
CREATE INDEX PAW_IDX0339323878 ON LINEITEM(L_ORDERKEY);-- 内连接,两个表都可以作为驱动表
SELECT * FROM ORDERS JOIN LINEITEM ON O_ORDERKEY = L_ORDERKEY;
-- 推荐的索引为
CREATE INDEX PAW_IDX1531629550 ON ORDERS(O_ORDERKEY);
CREATE INDEX PAW_IDX1365836084 ON LINEITEM(L_ORDERKEY);-- 外连接,外表作为驱动表,join条件作为升级为等值条件,参与索引推荐
SELECT * FROM ORDERS LEFT JOIN LINEITEM ON O_ORDERKEY = L_ORDERKEY;
-- 推荐的索引为
CREATE INDEX PAW_IDX1336974557 ON LINEITEM(L_ORDERKEY);SELECT * FROM ORDERS RIGHT JOIN LINEITEM ON O_ORDERKEY = L_ORDERKEY;
-- 推荐的索引为
CREATE INDEX PAW_IDX1002609246 ON ORDERS(O_ORDERKEY);SELECT * FROM ORDERS LEFT JOIN LINEITEM ON O_ORDERKEY = L_ORDERKEY WHERE l_shipdate = date '1998-12-01';
-- 推荐的索引为
CREATE INDEX PAW_IDX0711368375 ON LINEITEM(L_ORDERKEY,L_SHIPDATE);
  • DT子查询

-- Derived table,不同的查询块分别进行索引推荐,然后进行合并去重
select *
from supplier,(select l_suppkey, sum(l_extendedprice) as total_revenue from lineitem group by l_suppkey) revenue
where s_suppkey = revenue.l_suppkey;-- 推荐的索引为
CREATE INDEX PAW_IDX0151075817 ON SUPPLIER(S_SUPPKEY);
CREATE INDEX PAW_IDX1968327707 ON LINEITEM(L_SUPPKEY,L_EXTENDEDPRICE);
  • 条件子查询

-- 条件子查询
select *
fromsupplier
wheres_suppkey = (select l_suppkey from lineitem order by l_suppkey desc limit 1);-- 推荐的索引为
CREATE INDEX PAW_IDX0664775210 ON SUPPLIER(S_SUPPKEY);
CREATE INDEX PAW_IDX1518532301 ON LINEITEM(L_SUPPKEY);
  • CTE子查询

--  CTE
with revenue as
(select l_suppkey, sum(l_extendedprice) as total_revenue from lineitem group by l_suppkey)
select *
fromsupplier,revenue
wheres_suppkey = l_suppkey;-- 推荐的索引为
CREATE INDEX PAW_IDX0343576594 ON SUPPLIER(S_SUPPKEY);
CREATE INDEX PAW_IDX1518532301 ON LINEITEM(L_SUPPKEY,L_EXTENDEDPRICE);
  • 传递闭包重写-重写后进行索引推荐

-- 传递闭包,重写后进行索引推荐
select  o_custkey as cust_no,  l_extendedprice * (1 - l_discount)from  orders,  lineitemwhere l_orderkey = o_orderkeyand l_orderkey = 'ORD1234';-- 重写为,orders表上新增一个等值条件o_orderkey = 'ORD1234'
select  o_custkey as cust_no,  l_extendedprice * (1 - l_discount)from  orders,  lineitemwhere l_orderkey = o_orderkeyand l_orderkey = 'ORD1234'and o_orderkey = 'ORD1234';-- 推荐的索引为CREATE INDEX PAW_IDX0837835805 ON ORDERS(O_ORDERKEY,O_CUSTKEY);CREATE INDEX PAW_IDX1989932894 ON LINEITEM(L_ORDERKEY,L_DISCOUNT,L_EXTENDEDPRICE);
  • Ordinal重写-重写后进行索引推荐

-- orderby ordinal 重写
select L_SHIPDATE, count(*) as cnt, sum(bal) as bal from lineitem order by 1
-- 重写后的sql为
select L_SHIPDATE, count(*) as cnt, sum(bal) as bal from lineitem order by L_SHIPDATE
-- 推荐的索引为
CREATE INDEX PAW_IDX1424903467 ON LINEITEM(L_SHIPDATE);​-- groupby ordinal 重写
select l_shipdate, sum(l_quantity) as sum_qty from lineitem group by 1
-- 重写后的SQL为
select l_shipdate, sum(l_quantity) as sum_qty from lineitem group by l_shipdate
-- 推荐的索引为
CREATE INDEX PAW_IDX1614428511 ON LINEITEM(L_SHIPDATE,L_QUANTITY);
  • DELETE语句

delete from lineitem where l_shipdate = date '1998-12-01';CREATE INDEX PAW_IDX1533504424 ON LINEITEM(L_SHIPDATE);
  • UPDATE语句

update lineitem set l_shipmode='' where l_shipmode is null;CREATE INDEX PAW_IDX2000792795 ON LINEITEM(L_SHIPMODE);
  • INSERT语句

insert into lineitem select * from lineitem where l_shipmode in ('0');CREATE INDEX PAW_IDX2000792795 ON LINEITEM(L_SHIPMODE);
  • Merge语句

replace into lineitem select * where l_shipdate = date '1998-12-01' and l_shipmode = '0';CREATE INDEX PAW_IDX1942674217 ON LINEITEM(L_SHIPDATE,L_SHIPMODE);

PawSQL专注数据库性能优化,有兴趣的小伙伴请在微信搜索关注公众号PawSQL或许最新分享。Paw Index Advisor已登录Jetbrains Marketplace和Eclipse Marketplace, 小伙伴可以通过名称搜索“Paw Index Advisor”安装。

索引推荐神器Paw Index Advisor使用手册(2)-语法支持相关推荐

  1. POSTGRESQL index advisor 4种方式 (国内,国外,远程,云)那个更好

    索引建议,在PG的原生数据库上,并不提供这个功能,之前介绍过一些通过一些其他的方式来进行 index advisor的使用方式在PG 原生的数据库中使用.下面想阐述的是,其他的不同的POSTGRESQ ...

  2. oracle查询不走索引全表扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景-Oracle...

    使用索引快速全扫描(Index FFS)避免全表扫描的若干场景 什么使用使用Index FFS比FTS好? Oracle 8的Concept手册中介绍: 1. 索引必须包含所有查询中参考到的列. 2. ...

  3. MySQL(七):InnoDB 自适应Hash索引(Adaptive Hash Index)

    文章目录 1.简述 2.AHI(Adaptive Hash index)创建条件及注意事项 3.AHI(Adaptive Hash index)监控 3.1.通过 *show engine innod ...

  4. 别熬夜加班了,Facebook 开源了一款代码推荐神器!| 程序员硬核评测

    近日,科技巨头 Facebook 开源了一款代码到代码的搜索和推荐神器--Aroma,开发者基于此可以轻松找到常见的编码模式而无需手动浏览多个代码片段. 作者 | Celeste Barnaby.Sa ...

  5. oracle 索引快速全扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景

    使用索引快速全扫描(Index FFS)避免全表扫描(FTS) (文档 ID 70135.1) 什么使用使用Index FFS比FTS好? Oracle 8的Concept手册中介绍: 1. 索引必须 ...

  6. 前沿科技探究之AI在索引推荐的应用

    本节介绍索引推荐的功能,共包含三个子功能:单query索引推荐.虚拟索引和workload级别索引推荐. 单query索引推荐 单query索引推荐功能支持用户在数据库中直接进行操作,本功能基于查询语 ...

  7. pandas使用dropna函数计算返回dataframe中不包含缺失值的行索引列表list(index of rows without missing values in dataframe)

    pandas使用dropna函数计算返回dataframe中不包含缺失值的行索引列表list(index of rows without missing values in dataframe) 目录

  8. mysql+index组合索引_MySQL 优化之 index merge(索引合并)

    标签: MySQL5.0之前,一条语句中一个表只能使用一个索引,无法同时使用多个索引.但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引.理解了 index mer ...

  9. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?...

    一.介绍一下索引的类型 Mysql常见索引有:主键索引.唯一索引.普通索引.全文索引.组合索引 PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMA ...

最新文章

  1. QT乱码总结4.细谈本地编码
  2. dj电商-模型类设计-1.x-订单模块表
  3. sony微型计算机,舍我其谁?只有SONY做得到!
  4. 亚马逊表示并未放弃WP平台:正在打造新应用
  5. 2021谷饶中学高考成绩查询,2020汕头地理生物中考成绩查询入口
  6. WordPress 插件机制的简单用法和原理(Hook 钩子)
  7. 使用sprintf连接字符串
  8. python计算球体体积_漫谈超球体的体积公式
  9. 2019年6月中国编程语言排行榜
  10. centos7安装W3AF
  11. 华硕路由器修改 Hosts 以达到局域网内自定义解析
  12. 1.1 极限的概念【极限】
  13. Linux安装Kibana详细教程
  14. 前端学习周报(第三周)
  15. python 爬手机号_python手机号前7位归属地爬虫代码实例
  16. 在excel里面怎么筛选出11位的手机号码?
  17. VB Dim的初识与相关用法
  18. XMind、Axure、Visio这三个软件产品经理需要掌握哪个?要掌握到什么程度?
  19. 常用的几种PPT做图小技巧!
  20. 元宇宙区块链游戏开发 元宇宙手机游戏开发

热门文章

  1. You Arent Gonna Need It 理解
  2. 监控摄像头一般存几天
  3. 攻防世界-MISC:掀桌子
  4. 计算机修改wif教程,windows7无线wifi设置详细教程
  5. 车联网路侧单元RSU
  6. what is a hacker
  7. telegram账号被盗了,无法登录。
  8. 生活中的死锁例子及解决办法
  9. 让熟透的UBUNTU见鬼吧,我们要用OPENSUSE!
  10. uipath如何获取当日日期_UiPath之如何获取日期星期