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

sql使用技巧

目录

一、查询SQL尽量不要使用select *,而是具体字段

二、避免在where子句中使用 or 来连接条件

三、尽量使用数值替代字符串类 型

四、使用varchar代替char

五、技术延伸,char与varchar2的区别?

六、避免在where子句中使用!=或<>操作符


一、查询SQL尽量不要使用select *,而是具体字段

①错误示范:

SELECT * FROM user

②使用技巧:

SELECT id,username,tel FROM user


③why?

节省资源、减少网络开销。

可能用到覆盖索引,减少回表,提高查询效率。

二、避免在where子句中使用 or 来连接条件

①错误示范:

SELECT * FROM user WHERE id=1 OR salary=5000


②使用技巧:
(1)分开两条sql写

SELECT * FROM user WHERE id=1 SELECT * FROM user WHERE salary=5000


③why?

1 使用or可能会使索引失效,从而全表扫描;

2 对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描;

3 也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定;

4 虽然mysql是有优化器的,出于效率与成本考虑,遇到or条件,索引还是可能失效的;

三、尽量使用数值替代字符串类 型

①使用方法:

主键(id):primary key优先使用数值类型int,tinyint 性别(sex):0代表女,1代表男;数据库没有布尔类型,mysql推荐使用tinyint


③why?

1 因为引擎在处理查询和连接时会逐个比较字符串中每一个字符;

2 而对于数字型而言只需要比较一次就够了;

3 字符会降低查询和连接的性能,并会增加存储开销;

四、使用varchar代替char

①错误示范:

`address` char(100) DEFAULT NULL COMMENT '地址'


②使用技巧:

`address` varchar(100) DEFAULT NULL COMMENT '地址'


③why?

1 varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;

2 char按声明大小存储,不足补空格;

3 其次对于查询来说,在一个相对较小的字段内搜索,效率更高;

五、技术延伸,char与varchar2的区别?


1、char的长度是固定的,而varchar2的长度是可以变化的。

比如,存储字符串“101”,对于char(10),表示你存储的字符将占10个字节(包括7个空字符),在数据库中它是以空格占位的,而同样的varchar2(10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。

2、char的效率比varchar2的效率稍高。

3、何时用char,何时用varchar2?

char和varchar2是一对矛盾的统一体,两者是互补的关系,varchar2比char节省空间,在效率上比char会稍微差一点,既想获取效率,就必须牺牲一点空间,这就是我们在数据库设计上常说的“以空间换效率”。

varchar2虽然比char节省空间,但是假如一个varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起“行迁移”现象,而这造成多余的I/O,是数据库设计中要尽力避免的,这种情况下用char代替varchar2会更好一些。char中还会自动补齐空格,因为你insert到一个char字段自动补充了空格的,但是select后空格没有删除,因此char类型查询的时候一定要记得使用trim,这是写本文章的原因。

如果开发人员细化使用rpad()技巧将绑定变量转换为某种能与char字段相比较的类型(当然,与截断trim数据库列相比,填充绑定变量的做法更好一些,因为对列应用函数trim很容易导致无法使用该列上现有的索引),可能必须考虑到经过一段时间后列长度的变化。如果字段的大小有变化,应用就会受到影响,因为它必须修改字段宽度。

正是因为以上原因,定宽的存储空间可能导致表和相关索引比平常大出许多,还伴随着绑定变量问题,所以无论什么场合都要避免使用char类型。

六、避免在where子句中使用!=或<>操作符


①错误示范:

SELECT * FROM user WHERE salary!=5000 SELECT * FROM user WHERE salary<>5000


why?

1 使用!=和<>很可能会让索引失效

2 应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描

3 实现业务优先,实在没办法,就只能使用,并不是不能使用

http://www.jsqmd.com/news/631697/

相关文章:

  • 前端八股Vue(6)---v-if和v-for
  • “2 - 6岁孩子该读什么绘本?
  • 从零到一:基于OpenMV的智能小车多任务视觉识别与巡线实战解析
  • 嵌入式OTA封装库:解耦硬件与升级逻辑的生产级抽象层
  • SpringCloud进阶--Sentinel 流量防卫兵怕
  • DDR link ECC
  • MiniMax M. 发布!Redis 故障排查 + 跨语言重构场景实测,表现如何?确
  • LangGraph的容错机制:从节点失败到图级回滚
  • **用Python实现基于规则的音乐生成系统:从代码到旋律的奇妙之旅**在人工智能与创意产业深
  • Win+Docker+qwen.本地化养虾烙
  • 【独家首发】2026奇点大会未公开议程泄露:向量数据库将淘汰传统Embedding预计算(附性能对比实测数据)
  • 笑晕!我和朋友调试出一行“鬼畜C++代码”,4个nullptr叠满还能完美运行
  • .NET 新特性概览与相关文章索引檀
  • 微调效果衰减超预期?2026奇点大会首次公开7项微调鲁棒性评估指标(含GitHub可运行评测脚本)
  • Marimo 远程命令执行漏洞复现(CVE-2026-39987)
  • Agent-Sandbox UI 上线,来看看有哪些的功能是你经常使用的?诺
  • 紧急预警:未实施自动化测试用例生成的大模型服务,平均上线后缺陷逃逸率高达68%——立即部署这4个轻量级生成插件
  • SpringBoot 环境配置解析:Environment 与 PropertySource
  • STM32F0 RS485半双工通信库:精准方向控制与裸机优化
  • __block 变量内存布局详解岗
  • 2026届必备的六大降AI率网站实际效果
  • Python如何声明变量_动态类型特性与变量命名规范
  • Skills 编写学习罕
  • 彻底吃透哨兵值:从底层逻辑到自定义设计(附原创值域理论)
  • Melopero VL53L1X Arduino驱动库详解:高精度ToF测距集成指南
  • WindRunnerMax使
  • GPU还是NPU?HBM带宽、INT4吞吐、能效比TOP3芯片横向测评(SITS2026专家闭门报告)
  • 告别迷茫:手把手教你用Linux内核pci-epf-test快速验证PCIe Endpoint硬件
  • 使用 C# 删除 PDF 中的数字签名藤
  • Superpowers - 07 从 SessionStart Hook 看 Superpowers:把「技能库」变成「行为操作系统」