你有没有遇到过:点开一个网页,转圈转半天;后台导个数据,等得泡完一杯茶还没出来;APP刷新一次要十几秒……背后很可能就是数据库在偷偷“全表扫描”——相当于翻遍整本电话簿找一个人,能不慢吗?
啥是全表扫描?
简单说,就是数据库没走索引,老老实实从第一行看到最后一行,一条条比对条件。比如你查“张三的订单”,它不看姓名索引,而是把几十万条订单逐条翻一遍。
怎么一眼看出被扫了?
打开数据库管理工具(比如 phpMyAdmin、DBeaver),执行带 EXPLAIN 的查询:
EXPLAIN SELECT * FROM orders WHERE user_name = '张三';
如果 type 列显示 ALL,恭喜你,正在全表扫描。
3个接地气的解决办法
① 给常用查询字段加索引
就像给书加目录——查“用户名”就给 user_name 加索引:
ALTER TABLE orders ADD INDEX idx_user_name (user_name);
注意:别乱加!登录页查邮箱,就加邮箱索引;后台按时间导数据,就给 created_at 加索引。索引不是越多越好,写入会变慢,手机相册建100个分类反而难找照片,道理一样。
② 别用 LIKE '%关键词%' 开头
写成 WHERE title LIKE '%手机%',索引直接失效。换成 WHERE title LIKE '苹果%' 或用全文索引更靠谱。
③ 查询时少用 SELECT *
查用户列表只要头像和昵称,就写 SELECT avatar,nickname FROM users。少传点字段,网络省力,数据库也少读磁盘,自然快一截。
小提醒
不是所有表都要优化——家里记账用的 SQLite 小表,扫一遍才几毫秒,真不用折腾。重点盯住访问频繁、数据量上万的那几张表,比如订单、日志、商品库。优化前先 EXPLAIN 看一眼,别凭感觉瞎改。