SELECT * FROM sessions WHERE UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time) > 3600;
⭐⭐
✅ 索引失效
存储持续时间:ADD COLUMN duration INT AS (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time)) STORED
🧠 四、条件判断函数(含性能分析)
函数
示例
性能影响
索引影响
优化建议
IF()
SELECT id, IF(status=1, '启用', '禁用') AS status_text FROM devices;
⭐
❌ 无影响
可安全使用
CASE
SELECT CASE WHEN score>90 THEN 'A' ... END FROM exams;
⭐
❌ 无影响
复杂逻辑建议应用层处理
COALESCE()
SELECT COALESCE(email, phone) AS contact FROM users;
⭐⭐
❌ 无影响
避免在WHERE中使用:WHERE COALESCE(email,'') != '' → WHERE email IS NOT NULL
IFNULL()
SELECT IFNULL(discount, 0) FROM orders;
⭐
❌ 无影响
可安全使用
📊 五、聚合函数(含性能分析)
函数
示例
性能影响
索引影响
优化建议
COUNT()
SELECT COUNT(DISTINCT user_id) FROM big_table;
⭐⭐⭐⭐
✅ 全表扫描
用近似计数:SELECT COUNT(*) FROM (SELECT user_id FROM big_table GROUP BY user_id) tmp;
AVG()
SELECT AVG(salary) FROM employees WHERE dept=3;
⭐⭐
✅ 索引有效
确保dept有索引,大表分片统计
GROUP_CONCAT()
SELECT dept, GROUP_CONCAT(name) FROM emp GROUP BY dept;
⭐⭐⭐
✅ 内存消耗
设置group_concat_max_len限制长度
SUM()
SELECT SUM(amount) FROM sales WHERE date>'2025-01-01';
⭐⭐
✅ 索引有效
添加覆盖索引:INDEX(date, amount)
🔍 六、高级函数(含性能分析)
函数
示例
性能影响
索引影响
优化建议
ROW_NUMBER()
SELECT id, ROW_NUMBER() OVER(ORDER BY score DESC) FROM students;
⭐⭐⭐
❌ 无索引
MySQL 8.0+使用,避免大表全排序
CAST()
SELECT * FROM products WHERE CAST(price AS UNSIGNED) > 1000;
⭐⭐⭐⭐
✅ 索引失效
存储时使用正确类型,避免转换
UUID()
INSERT INTO orders(id, ...) VALUES(UUID(), ...);
⭐⭐
✅ 索引碎片
改用有序UUID:UUID_TO_BIN(UUID(), 1)
FULLTEXT()
SELECT * FROM articles WHERE MATCH(content) AGAINST('MySQL');
⭐⭐
✅ 专用索引
使用全文索引并优化配置
💎 函数使用黄金法则
1. 索引失效高危场景
-- 错误:函数包裹索引字段SELECT*FROM users WHERE DATE_FORMAT(create_time,'%Y%m')='202508';-- 正确:保持索引列纯净SELECT*FROM users WHERE create_time BETWEEN'2025-08-01'AND'2025-08-31';
2. 预计算策略
-- 实时计算(避免)SELECT*, price*0.9AS discount_price FROM products;-- 预存储方案(推荐)ALTERTABLE products ADD discount_price DECIMAL(10,2)AS(ROUND(price*0.9,2)) STORED;CREATEINDEX idx_discount ON products(discount_price);
3. 函数执行成本分级
级别
特征
代表函数
⭐
轻量级
IF(), COALESCE()
⭐⭐
中等
DATE_ADD(), CONCAT()
⭐⭐⭐
较重
RAND(), GROUP_CONCAT()
⭐⭐⭐⭐
高危
SUBSTRING(字段), CAST(字段)
⭐⭐⭐⭐⭐
灾难
ORDER BY RAND()
4. 优化检测工具
-- 检查索引使用EXPLAINSELECT*FROM users WHERE LOWER(username)='admin';-- 性能分析SET profiling =1;SELECT...;SHOW PROFILE FOR QUERY 1;