源码先锋

源码先锋

MySQL 连接查询太慢?3 个狠招,瞬间提速 100 倍!

admin 145 101

单表查询秒出,一用JOIN就卡到超时?后台报错刷屏,用户投诉不断?别慌!这3招直接根治,看完就能用!

核心问题:连接查询为啥慢?

索引缺失:连接字段没索引,MySQL全表扫描找匹配,1万行数据能扫出1亿次操作

驱动表选错:小表驱动大表才高效,优化器选错顺序,扫描行数翻倍

第1招:连接字段必须焊死索引!

✅关键操作:ON后面的字段,两边都得有索引!

--反面例子:order表user_id无索引,查10万订单要5秒,_noFROMuseruJOIN`order`=_id;--优化方案:给_id建索引,瞬间变0.01秒CREATEINDEXidx_order_useridON`order`(user_id);

⚠️多表连接(A→B→C),每个连接字段都得有索引,少一个就卡壳!

第2招:小表驱动大表,速度翻倍!

✅核心逻辑:用小结果集驱动大表,减少匹配次数

--正确示范:user表过滤后仅100行(小表),驱动order表(1000万行),_noFROMuseruJOIN`order`=__time'2024-01-01';

优化器犯傻时,用STRAIGHT_JOIN强制指定:

--左边是驱动表,右边是被驱动表,_noFROMuseruSTRAIGHT_JOIN`order`=_id;
第3招:别用SELECT*,给查询瘦个身!

✅关键动作:只查必要字段,拒绝大字段拖累速度

--反面教材:查所有字段,传输100MB数据SELECT*FROMuseruJOIN`order`=_id;--优化方案:只取需要的4个字段,数据量降为10,,_no,`order`=_id;

进阶技巧:建覆盖索引,连表都不用回

CREATEINDEXidx_order_userid_amountON`order`(user_id,amount);
3个致命错误,千万别犯!

SELECT*必坑:大字段(text、长varchar)拖慢传输,查得越多死得越惨

ON后用函数:比如SUBSTR(,1,3)=,直接导致索引失效

连接表太多:超过3张表,性能断崖式下跌,能拆成多次查询就拆

实战案例:从5秒到0.05秒的蜕变

原始慢查询:

,,_noFROMuseruJOIN`order`=__login'2024-06-30'=1;

优化3步走:

给order表建复合索引:idx_order_userid_status(user_id,status)

给user表加索引:idx_user_lastlogin(last_login)

确保user表(过滤后5000行)当驱动表

结果:查询时间从5秒→0.05秒,老板当场加鸡腿!