PostgreSQL/pgsql数据库优化查询和索引的猜想
此文是我做为日记来用的,后面再规范和整理
1、索引太多会影响Insert、Update;
2、索引太少不利于性能调优;
3、数据结构分析、SQL拼写的分析如果太复杂,又不利于实际的开发工作;
故,是否可以这样:
1、第一步,确定某个表可能用到的、经常使用的查询条件,不建议加索引的字段后面会忽略
SELECT * FROM t_big_data aa WHERE 1=1 AND aa.billingtime>='2021-08-01' AND aa.billingtime<'2021-08-02' AND aa.stateId=1 -- 此字段不建议加索引,后面建索引时会忽略它AND aa.patientid='360732199801031328' AND aa.departmentid='0307'AND aa.roomId='1001'AND aa.doctorId='2398';
2、第二步,为该表创建常用查询使用的索引
-- billingtime业务发生时间,是连续数据,一般是范围查询,适合brin索引
CREATE INDEX idx_big_data_billingtime ON big_data USING brin(billingtime);-- 其他字段使用多字段联合索引,默认btree
CREATE INDEX idx_big_data_search ON big_data(patientid, departmentid, roomId, doctorId);
3、最后,在代码和存储过程函数中,规范Where的书写,使用CASE WHEN对条件字段特殊处理,对查询语句中不做为条件的参数,程序将会赋“ALL”值。
如:
SELECT * FROM t_big_data aa WHERE 1=1 AND aa.billingtime>=@begintime AND aa.billingtime<@endtime AND aa.stateId=1AND aa.patientid=CASE @patientId WHEN 'ALL' WHEN aa.patientid ELSE @patientId ENDAND aa.departmentid=CASE @departmentid WHEN 'ALL' WHEN aa.departmentid ELSE @departmentid ENDAND aa.roomId=CASE @roomId WHEN 'ALL' WHEN aa.roomId ELSE @roomId ENDAND aa.doctorId=CASE @doctorId WHEN 'ALL' WHEN aa.doctorId ELSE @doctorId END;
程序对这些参数赋值后,变成实际的值,以第1步中的SQL为例,若本次查询无需对patientId字段进行判断,则可以对相应的@patientId变量赋“ALL”值,其他变量照常赋值,生成实际的SQL如下:
SELECT * FROM t_big_data aa WHERE 1=1 AND aa.billingtime>='2021-08-01' AND aa.billingtime<'2021-08-02' AND aa.stateId=1-- @patientId传进来是ALL值,实际生成SQL语句就是这样的效果,-- 则此句与 “AND aa.patientid=aa.patientid” 等效AND aa.patientid=CASE 'ALL' WHEN 'ALL' WHEN aa.patientid ELSE 'ALL' ENDAND aa.departmentid=CASE '0307' WHEN 'ALL' WHEN aa.departmentid ELSE '0307' ENDAND aa.roomId=CASE '1001' WHEN 'ALL' WHEN aa.roomId ELSE '1001' ENDAND aa.doctorId=CASE '2398' WHEN 'ALL' WHEN aa.doctorId ELSE '2398' END;
4、经过 EXPLAIN分析执行计划,这样做用到了相关的两个索引。
总之,我似乎找到了一种能在建索引时【偷懒】,又不影响数据库性能的方案。
最后是由此带来的问题
1、虽然这样做【节约】了索引,查询也用到了必要的索引,在测试库中的执行性能也没问题;
2、但是,对数据库底层逻辑的分析和猜想,上面这种写法增加了无必要的字段的判断,不确定这样做,对数据库会不会造成无意义的硬盘IO等问题。
PS:MySQL 5.7我也测试过,这样的写法没有用到索引,那边库里的数据量比较小,不确定性能如何
先把这个【点子】记录下来,以后再做分析和测试。
希望数据库的大拿们能够帮我分析和指正。
PostgreSQL/pgsql数据库优化查询和索引的猜想相关推荐
- 数据库优化查询的方法以及大访问量到数据库时的优化
一.数据库优化查询的方法 1.使用索引: 应尽量避免全表扫描,首先考虑在where 以及 order by ,group by 涉及的列上建立索引 2.优化SQL语句: 1>通过explai ...
- 用MySql的查询分析语法explain来优化查询和索引
http://hi.baidu.com/wtnzone/item/beb83840a4971af4dd0f6c77 数据库最常见的操作就是查询了,我们经常要用"SELECT"语法对 ...
- 数据库-优化-SQL及索引优化
SQL及索引优化 mysql安装与卸载(linux在线安装与卸载) 数据库版本选择 1.查看数据库的版本 select @@version; 2.准备数据 网址:https://dev.mysql.c ...
- 数据库优化 - 多列索引经典题目
题目 假设某个表有一个联合索引(c1,c2,c3,c4)一下--只能使用该联合索引的c1,c2,c3部分 A where c1=x and c2=x and c4>x and c3=x B wh ...
- 数据库篇(八)——优化查询
数据库优化查询的方法有: 1.使用索引 尽量避免全表扫描,首先应考虑在where及order by,group by涉及的列上建立索引. 2.优化SQL语句 通过explain来查看SQL语句的执行效 ...
- 面试中回答关于oracle数据库优化的方法
1关于优化器的优化配置 介绍oracle数据库优化的基本方式,基于规则的优化,基于规则包括全表扫描,扫描第一行 (需要上网查看一下) 基于成本的优化,基于选择的优化 也就是oracle的3种优化器,关 ...
- Java面试题:数据库优化策略有哪些?
1.Sql优化主要优化的还是查询, 优化查询的话, 索引优化是最有效的方案. 首先要根据需求写出结构良好的SQL,然后根据SQL 在表中建立有效的索引.但是如果索引太多,不但会影响写入的效率,对查询也 ...
- oracle数据优化面试题,面试中回答关于oracle数据库优化的方法
2015-08-16 06:30:01 阅读( 470 ) 1关于优化器的优化配置 介绍oracle数据库优化的基本方式,基于规则的优化,基于规则包括全表扫描,扫描第一行 (需要上网查看一下) 基于成 ...
- Sql与数据库优化的几条核心建议
本文目录: 为什么要进行数据库优化 MySql数据库优化 SQL及索引优化 MySQL慢查日志分析工具 通过explain查询分析SQL的执行计划 具体慢查询优化的案例 1. 为什么要进行数据库优化 ...
- 数据库MySQL/mariadb知识点——索引
索引 索引是特殊数据结构:定义在查找时作为查找条件的字段,索引实现在存储引擎. 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器避免排序和使用临时表 索引可以帮助将随机I/O转 ...
最新文章
- Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp
- Java 9 揭秘(19. 平台和JVM日志)
- 苹果11怎么关掉横屏_苹果手机这些常规操作你可能不会!教你省电又省心?
- python time模块
- select函数(一)
- windows 串口编程 c语言,windows下C语言版串口发送程序(基于VS2017)
- ajax异步加载和cmd,异步传输Ajax(JQ)
- 【评测机】评测时报错cc1plus: fatal error: /xx/xx/main.cpp: Permission denied compilation terminated.的解决方法...
- 进度条ProgressBar及ProgressDialog
- while和do-while的区别
- 如何使用Tuxera NTFS for Mac禁用特定NTFS分区
- macos big sur永久关闭final cut Pro通知的技巧
- spss分析方法-因子分析(转载)
- FastStone Capture 画图吸色工具
- MPI点对点通信函数与通信模式
- PhotoShop学习篇
- 计算机维修技术精解,《显卡维修知识精解——计算机维修技术精解》【价格 目录 书评 正版】_中图网...
- “人生苦短,我用Python“——身份认证攻击
- 批量html转word 或者 pdf
- JSP中include的两种方法
热门文章
- mysql delete数据怎么恢复_mysql数据delete后的数据恢复
- java数组排序的方法_Java数组排序方法详解
- sinx加expx定积分计算c语言,8.13 写一个用矩阵法求定积分的通用函数,分别求 sinx,cosx,exp(x)的积分;...
- sin x 的值python_sin(x)/x的数值积分
- plsql连接mysql教程_PLSQL Developer连接oracle数据库配置教程
- 大学学习路线规划建议贴
- ffplay播放器原理剖析
- IP地址的两种表示方法:整数和点分十进制
- 电工培训维修电工基础知识实训教学
- MIME类型“ image / jpg”是否与“ image / jpeg”相同?