当前位置: 首页 > news >正文

sql查询优化小知识-01,非等值条件查询影响

前言:SQL查询中,使用非等值条件(如<<=>>=INBETWEEN 等)进行筛选时,可能会使后面的条件无法有效使用索引,从而影响查询性能。下面我通过一些例子和反例来解释这个问题,并提供优化建议。

示例

假设我们有一个包含以下字段的用户表 users

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT,registration_date DATE
);

并且在 ageregistration_date 上分别创建了索引:

CREATE INDEX idx_age ON users(age);
CREATE INDEX idx_registration_date ON users(registration_date);

不推荐的查询(使用非等值条件)

SELECT * FROM users WHERE age > 30 AND registration_date = '2023-01-01';

在上述查询中,因为 age > 30 是一个非等值条件,数据库优化器可能只会使用 age 索引,而忽略 registration_date 的索引,这会导致查询性能下降。

推荐的查询(使用等值条件)

SELECT * FROM users WHERE age = 30 AND registration_date = '2023-01-01';

在这种情况下,数据库优化器可以使用索引来加速 ageregistration_date 的条件,从而提高查询性能。

反例和优化

反例(使用多个非等值条件)
SELECT * FROM users WHERE age BETWEEN 25 AND 35 AND registration_date < '2023-01-01';

在这种情况下,数据库优化器可能只会使用 age 索引,忽略 registration_date 的索引。同样地,多个非等值条件会使优化器在选择索引时更为艰难。

优化
  1. 尽量使用等值条件:

    SELECT * FROM users WHERE age = 30 AND registration_date = '2023-01-01';
    
  2. 使用复合索引(如果业务逻辑允许):

    如果查询频繁过滤 ageregistration_date,可以考虑使用复合索引:

    CREATE INDEX idx_age_registration_date ON users(age, registration_date);
    

    这使得数据库能够同时利用复合索引来优化查询:

    SELECT * FROM users WHERE age BETWEEN 25 AND 35 AND registration_date < '2023-01-01';
    

    通过这种方法,即使存在非等值条件,复合索引仍然能够提高查询性能。

总结

为了优化查询性能,尽量使用等值条件进行筛选。如果业务逻辑确实需要使用非等值条件,可以考虑使用复合索引来提高性能。此外,也可以借助数据库的查询计划(使用 EXPLAIN 关键字)来了解具体的索引使用情况,并据此做进一步优化。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue3基础语法
  • C#-了解ORM框架SqlSugar并快速使用(附工具)
  • c# 对接第三方接口实现签名
  • 记一次因敏感信息泄露而导致的越权+存储型XSS
  • 谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新
  • 微信小程序云开发订单微信支付与小票和标签打印的完整高效流程
  • 【C# 】Pipe管道通信使用
  • Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解
  • SSRF-labs-master靶场
  • FFmpeg研究
  • ai智能写作软件哪个好?高效写作少不了这5个
  • 大数据——Hive原理
  • mysql 数据库空间统计sql
  • 一条命令安装mysql,php
  • C++——从前序与中序遍历序列构造二叉树leetcode105
  • 【EOS】Cleos基础
  • avalon2.2的VM生成过程
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6核心特性
  • Js基础知识(一) - 变量
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Vue.js源码(2):初探List Rendering
  • vue自定义指令实现v-tap插件
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 欢迎参加第二届中国游戏开发者大会
  • 记录:CentOS7.2配置LNMP环境记录
  • 免费小说阅读小程序
  • 前嗅ForeSpider教程:创建模板
  • 如何编写一个可升级的智能合约
  • 时间复杂度与空间复杂度分析
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 阿里云服务器购买完整流程
  • 通过调用文摘列表API获取文摘
  • ​Redis 实现计数器和限速器的
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​数据结构之初始二叉树(3)
  • #### go map 底层结构 ####
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (安卓)跳转应用市场APP详情页的方式
  • (二十三)Flask之高频面试点
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (十)Flink Table API 和 SQL 基本概念
  • (推荐)叮当——中文语音对话机器人
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET C# 使用 iText 生成PDF
  • .NET分布式缓存Memcached从入门到实战
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET中winform传递参数至Url并获得返回值或文件
  • @Autowired标签与 @Resource标签 的区别
  • @NoArgsConstructor和@AllArgsConstructor,@Builder