MySQL内置函数实战技巧与性能优化指南

发布时间:2026/11/5 8:33:16

MySQL内置函数实战技巧与性能优化指南 1. MySQL内置函数全面解析作为一名长期与MySQL打交道的开发者我发现很多刚入门的同行对内置函数的理解仅限于表面用法。今天我将结合多年实战经验深度剖析MySQL最常用的四类内置函数带你掌握那些官方文档里没写的实用技巧。2. 日期函数实战指南2.1 基础日期时间操作最常用的日期函数莫过于获取当前时间的几个函数SELECT CURRENT_DATE(); -- 2023-08-15 SELECT CURRENT_TIME(); -- 14:30:22 SELECT NOW(); -- 2023-08-15 14:30:22.123456注意NOW()返回的是完整的datetime类型包含微秒精度而SYSDATE()会在每次调用时重新获取系统时间日期计算是业务系统的高频需求DATE_ADD和DATE_SUB的灵活用法值得掌握-- 三天后的这个时间 SELECT DATE_ADD(NOW(), INTERVAL 3 DAY); -- 两个月前的今天 SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 2 MONTH); -- 精确到分钟的时间计算 SELECT DATE_ADD(2023-08-15 14:30:00, INTERVAL 15 MINUTE);2.2 日期差值计算与类型转换DATEDIFF函数虽然简单但在实际业务中非常实用-- 计算两个日期相差天数 SELECT DATEDIFF(2023-12-31, 2023-01-01); -- 364 -- 结合DATE函数提取日期部分 SELECT DATEDIFF( DATE(2023-08-15 14:30:00), DATE(2023-08-10 09:15:00) ); -- 5日期类型转换的常见场景-- datetime转date SELECT DATE(NOW()); -- 2023-08-15 -- 字符串转datetime SELECT STR_TO_DATE(08/15/2023, %m/%d/%Y); -- 2023-08-15 00:00:002.3 日期函数性能优化建议避免在WHERE条件中对字段使用函数计算-- 反例无法使用索引 SELECT * FROM orders WHERE DATE_FORMAT(create_time,%Y-%m)2023-08; -- 正例可以利用索引 SELECT * FROM orders WHERE create_time BETWEEN 2023-08-01 00:00:00 AND 2023-08-31 23:59:59;处理时区问题-- 转换为UTC时间 SELECT CONVERT_TZ(NOW(), SYSTEM, UTC); -- 设置会话时区 SET time_zone 08:00;3. 字符串处理高级技巧3.1 字符串连接与截取CONCAT函数虽然基础但有几个实用变体-- 基本连接 SELECT CONCAT(Hello, , World); -- Hello World -- 处理NULL值 SELECT CONCAT(Hello, NULL, World); -- NULL SELECT CONCAT_WS(-, 2023, 08, 15); -- 2023-08-15 -- 安全截取字符串 SELECT SUBSTRING(MySQL, 2, 3); -- ySQ SELECT SUBSTRING(MySQL FROM 2 FOR 3); -- 同上经验SUBSTRING的position参数从1开始计数如果超过字符串长度返回空字符串3.2 字符串查找与替换INSTR和LOCATE的对比使用-- 查找子串位置 SELECT INSTR(foobarbar, bar); -- 4 SELECT LOCATE(bar, foobarbar, 5); -- 从第5位开始查找返回7 -- 安全替换 SELECT REPLACE(www.mysql.com, mysql, oracle); -- www.oracle.com SELECT REPLACE(Hello, NULL, Hi); -- 返回NULL3.3 字符串格式化与清理处理用户输入时的字符串清理-- 去除空格 SELECT TRIM( MySQL ); -- MySQL SELECT LTRIM( MySQL ); -- MySQL SELECT RTRIM( MySQL ); -- MySQL -- 格式化显示 SELECT LPAD(7, 3, 0); -- 007 SELECT RPAD(Hi, 5, !); -- Hi!!! SELECT FORMAT(1234567.89, 2); -- 1,234,567.894. 数值计算与随机数生成4.1 数学运算函数精确的数值计算在金融系统中尤为重要-- 基本运算 SELECT ABS(-3.14); -- 3.14 SELECT CEILING(3.14); -- 4 SELECT FLOOR(3.14); -- 3 SELECT ROUND(3.14159, 3); -- 3.142 -- 取模运算的特殊情况 SELECT MOD(10, 3); -- 1 SELECT 10 % 3; -- 同上 SELECT MOD(10, 0); -- NULL4.2 进制转换技巧处理不同进制数据的转换-- 常用进制转换 SELECT BIN(10); -- 1010 SELECT HEX(255); -- FF SELECT OCT(8); -- 10 -- 任意进制间转换 SELECT CONV(A, 16, 10); -- 10 SELECT CONV(1010, 2, 16); -- A4.3 随机数生成实战生成测试数据时随机数的妙用-- 基本随机数 SELECT RAND(); -- [0,1)之间的随机数 -- 生成1-100的随机整数 SELECT FLOOR(1 RAND() * 100); -- 可复现的随机序列相同种子产生相同序列 SELECT RAND(42); -- 每次返回相同的随机值提示在ORDER BY RAND()实现随机排序时大数据量表性能极差应考虑其他方案5. 系统函数与高级应用5.1 用户与数据库信息获取环境信息的常用函数-- 用户信息 SELECT USER(); -- rootlocalhost SELECT CURRENT_USER(); -- 同上 SELECT SYSTEM_USER(); -- 同上 -- 数据库信息 SELECT DATABASE(); -- 当前数据库名 SELECT VERSION(); -- 8.0.33 SELECT CONNECTION_ID(); -- 连接ID5.2 加密函数安全实践密码存储的正确姿势-- MD5加密已不推荐用于密码存储 SELECT MD5(password); -- 32位哈希值 -- MySQL特有的PASSWORD函数 SELECT PASSWORD(secret); -- *14E65567ABDB5135D0CFD9A70B3032C179A49EE7 -- 更安全的做法使用SHA2 SELECT SHA2(password, 256); -- 64位哈希值重要生产环境密码存储应使用专门的密码哈希函数如bcrypt而非MD5等快速哈希5.3 条件逻辑函数处理NULL值的优雅方式-- 基本用法 SELECT IFNULL(NULL, default); -- default SELECT IFNULL(not null, default); -- not null -- 复杂条件判断 SELECT CASE WHEN score 90 THEN A WHEN score 80 THEN B ELSE C END AS grade FROM students; -- NULL安全比较 SELECT NULL NULL; -- 1 (TRUE) SELECT NULL NULL; -- NULL6. 函数性能优化与避坑指南6.1 索引使用禁忌避免在索引列上使用函数-- 反例索引失效 SELECT * FROM users WHERE YEAR(create_time) 2023; -- 正例可以使用索引 SELECT * FROM users WHERE create_time BETWEEN 2023-01-01 AND 2023-12-31;字符串函数与索引-- 反例左模糊查询无法使用索引 SELECT * FROM products WHERE name LIKE %phone%; -- 正例右模糊可以使用索引 SELECT * FROM products WHERE name LIKE iPhone%;6.2 隐式类型转换陷阱混合类型比较的常见问题-- 字符串与数字比较可能导致全表扫描 SELECT * FROM orders WHERE order_id 100; -- 比 order_id 100 性能更好如果order_id是整数类型 -- 日期比较的隐式转换 SELECT * FROM logs WHERE log_date BETWEEN 2023-08-01 AND 2023-08-31; -- 比 WHERE log_date BETWEEN 20230801 AND 20230831 更安全6.3 函数调用开销控制减少重复函数调用的技巧-- 反例NOW()每次调用都重新计算 SELECT id, NOW() AS current_time FROM large_table; -- 正例使用变量存储函数结果 SET current_time NOW(); SELECT id, current_time AS current_time FROM large_table;在实际项目中我经常看到开发者过度依赖数据库函数处理本该在应用层完成的逻辑。记住SQL函数虽强大但滥用会导致性能瓶颈。对于复杂的数据处理合理的做法是在数据库完成基础处理后将结果集交给应用层进一步处理。
延伸阅读

更多相关文章

2026/11/5 8:33:16

0-1 BFS算法在水质检测最短路径问题中的应用

1. 问题背景与算法选型蓝桥杯竞赛中的"水质检测"问题是一个典型的图论最短路径问题。题目通常描述为:给定一个NM的网格地图,其中某些网格是污染源(障碍物),检测员需要从起点出发,找到到达目标点的…

2026/11/5 8:33:16

Docker Compose 下载与更新全攻略:镜像加速、离线安装与版本升级

1. 为什么一个“下载并更新”的动作值得单独写一篇docker-compose这个工具,但凡做过容器化部署的人都不陌生。它把一堆docker run命令收进一个 YAML 文件里,一条docker-compose up -d就能把整套服务拉起来。但真正让人卡住的,往往不是写 comp…

2026/11/5 8:28:15

OpenMV与STM32F103C8T6串口通信实现物料搬运机器人视觉控制

简介:这份资源面向参加工程训练类比赛的学生与嵌入式初学者,提供一套基于OpenMV视觉模块与STM32F103C8T6微控制器的物料搬运机器人完整代码方案,用C语言实现图像识别、目标定位与运动控制的协同,解决机器人自主识别物料并完成抓取…

2026/11/5 8:48:17

【Java基础知识】字面量与变量

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 8:48:17

kafka--基础知识点--0

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 8:48:17

快速上手playwight

在自动化测试和网页爬虫的领域,Selenium 曾是无可争议的霸主。然而,随着现代 Web 应用越来越复杂(大量使用 React、Vue、单页应用等),传统的测试工具开始显得有些力不从心。今天,我们要聊的是由微软开源的现…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑