此文是我做为日记来用的,后面再规范和整理

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. 数据库优化查询的方法以及大访问量到数据库时的优化

    一.数据库优化查询的方法 1.使用索引: 应尽量避免全表扫描,首先考虑在where 以及 order by  ,group  by 涉及的列上建立索引 2.优化SQL语句: 1>通过explai ...

  2. 用MySql的查询分析语法explain来优化查询和索引

    http://hi.baidu.com/wtnzone/item/beb83840a4971af4dd0f6c77 数据库最常见的操作就是查询了,我们经常要用"SELECT"语法对 ...

  3. 数据库-优化-SQL及索引优化

    SQL及索引优化 mysql安装与卸载(linux在线安装与卸载) 数据库版本选择 1.查看数据库的版本 select @@version; 2.准备数据 网址:https://dev.mysql.c ...

  4. 数据库优化 - 多列索引经典题目

    题目 假设某个表有一个联合索引(c1,c2,c3,c4)一下--只能使用该联合索引的c1,c2,c3部分 A where c1=x and c2=x and c4>x and c3=x B wh ...

  5. 数据库篇(八)——优化查询

    数据库优化查询的方法有: 1.使用索引 尽量避免全表扫描,首先应考虑在where及order by,group by涉及的列上建立索引. 2.优化SQL语句 通过explain来查看SQL语句的执行效 ...

  6. 面试中回答关于oracle数据库优化的方法

    1关于优化器的优化配置 介绍oracle数据库优化的基本方式,基于规则的优化,基于规则包括全表扫描,扫描第一行 (需要上网查看一下) 基于成本的优化,基于选择的优化 也就是oracle的3种优化器,关 ...

  7. Java面试题:数据库优化策略有哪些?

    1.Sql优化主要优化的还是查询, 优化查询的话, 索引优化是最有效的方案. 首先要根据需求写出结构良好的SQL,然后根据SQL 在表中建立有效的索引.但是如果索引太多,不但会影响写入的效率,对查询也 ...

  8. oracle数据优化面试题,面试中回答关于oracle数据库优化的方法

    2015-08-16 06:30:01 阅读( 470 ) 1关于优化器的优化配置 介绍oracle数据库优化的基本方式,基于规则的优化,基于规则包括全表扫描,扫描第一行 (需要上网查看一下) 基于成 ...

  9. Sql与数据库优化的几条核心建议

    本文目录: 为什么要进行数据库优化 MySql数据库优化 SQL及索引优化 MySQL慢查日志分析工具 通过explain查询分析SQL的执行计划 具体慢查询优化的案例 1. 为什么要进行数据库优化 ...

  10. 数据库MySQL/mariadb知识点——索引

    索引 ​ 索引是特殊数据结构:定义在查找时作为查找条件的字段,索引实现在存储引擎. 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器避免排序和使用临时表 索引可以帮助将随机I/O转 ...

最新文章

  1. Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp
  2. Java 9 揭秘(19. 平台和JVM日志)
  3. 苹果11怎么关掉横屏_苹果手机这些常规操作你可能不会!教你省电又省心?
  4. python time模块
  5. select函数(一)
  6. windows 串口编程 c语言,windows下C语言版串口发送程序(基于VS2017)
  7. ajax异步加载和cmd,异步传输Ajax(JQ)
  8. 【评测机】评测时报错cc1plus: fatal error: /xx/xx/main.cpp: Permission denied compilation terminated.的解决方法...
  9. 进度条ProgressBar及ProgressDialog
  10. while和do-while的区别
  11. 如何使用Tuxera NTFS for Mac禁用特定NTFS分区
  12. macos big sur永久关闭final cut Pro通知的技巧
  13. spss分析方法-因子分析(转载)
  14. FastStone Capture 画图吸色工具
  15. MPI点对点通信函数与通信模式
  16. PhotoShop学习篇
  17. 计算机维修技术精解,《显卡维修知识精解——计算机维修技术精解》【价格 目录 书评 正版】_中图网...
  18. “人生苦短,我用Python“——身份认证攻击
  19. 批量html转word 或者 pdf
  20. JSP中include的两种方法

热门文章

  1. mysql delete数据怎么恢复_mysql数据delete后的数据恢复
  2. java数组排序的方法_Java数组排序方法详解
  3. sinx加expx定积分计算c语言,8.13 写一个用矩阵法求定积分的通用函数,分别求 sinx,cosx,exp(x)的积分;...
  4. sin x 的值python_sin(x)/x的数值积分
  5. plsql连接mysql教程_PLSQL Developer连接oracle数据库配置教程
  6. 大学学习路线规划建议贴
  7. ffplay播放器原理剖析
  8. IP地址的两种表示方法:整数和点分十进制
  9. 电工培训维修电工基础知识实训教学
  10. MIME类型“ image / jpg”是否与“ image / jpeg”相同?