
uid和order_status字段的订单表在查询select * from order_info where uid=5837661 order by id asc limit 1时,虽然表上有idx_uid_stat(uid,order_status)复合索引,但执行计划显示使用了全表扫描而非索引。
EXPLAIN分析查询执行计划,发现possible_keys显示可能使用idx_uid_stat,但实际key为空optimizer_trace分析优化器决策过程-- 优化查询方式1:强制使用索引
SELECT * FROM order_info FORCE INDEX(idx_uid_stat)
WHERE uid=5837661 ORDER BY id ASC LIMIT 1;
-- 优化查询方式2:使用覆盖索引
SELECT id FROM order_info
WHERE uid=5837661 ORDER BY id ASC LIMIT 1;系统出现死锁错误,多个事务相互等待对方释放锁资源,导致业务请求超时。
SHOW ENGINE INNODB STATUS查看死锁信息-- 1. 统一加锁顺序
BEGIN;
SELECT * FROM table1 WHERE id=1 FOR UPDATE;
SELECT * FROM table2 WHERE id=2 FOR UPDATE;
COMMIT;
-- 2. 调整隔离级别(根据业务需求)
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 3. 减少事务持有锁的时间
-- 将大事务拆分为小事务innodb_lock_wait_timeout查询条件WHERE email='xxx'会漏掉NULL记录,导致数据不完整。
= NULL条件无效IS NULL语法-- 正确查询NULL值的方法
SELECT * FROM users WHERE email IS NULL;
-- 查询非NULL值
SELECT * FROM users WHERE email IS NOT NULL;
-- 多表关联时处理NULL值
SELECT u.*, COALESCE(p.phone, 'N/A')
FROM users u LEFT JOIN phones p ON u.id = p.user_id;IS NULL/IS NOT NULL判断空值IS NULL(InnoDB不索引全NULL记录)LEFT JOIN+COALESCE保证主表记录不丢失LIKE '%keyword'前导通配符通过以上真实案例的分析和解决方案,希望能帮助开发者避免常见的MySQL陷阱,提高数据库应用的稳定性和性能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。