上一篇
"小王,那个客户列表页面怎么加载这么慢?" 产品经理皱着眉头问道。
小王赶紧检查后台日志,发现一个简单的分页查询居然耗时3秒多——明明只是请求100条数据而已,这种场景在开发中太常见了:数据量小的时候一切正常,随着业务增长,查询性能逐渐恶化。
今天我们就来聊聊,如何高效地从数据库获取100条数据——这个看似简单却暗藏玄机的操作。
-- 错误示范:查询所有字段 SELECT * FROM users LIMIT 100; -- 正确姿势:只查必要字段 SELECT id, name, email FROM users LIMIT 100;
为什么重要:
-- 深层分页的性能灾难(跳过前10万条) SELECT * FROM orders LIMIT 100 OFFSET 100000; -- 优化方案:使用游标分页 SELECT * FROM orders WHERE id > 上次最后ID ORDER BY id LIMIT 100;
实测对比:
| 方法 | 10万数据量耗时 | 100万数据量耗时 |
|-------|---------------|----------------|
| LIMIT OFFSET | 1200ms | 超时 |
| 游标分页 | 2ms | 3ms |
-- 没有排序的查询可能每次结果顺序不同 SELECT * FROM products LIMIT 100; -- 明确排序规则 SELECT * FROM products ORDER BY create_time DESC LIMIT 100;
注意:
场景:查询最近100个活跃用户
-- 低效查询(没有合适索引) SELECT * FROM users WHERE is_active = 1 ORDER BY last_login DESC LIMIT 100; -- 创建复合索引 CREATE INDEX idx_active_login ON users(is_active, last_login DESC);
索引选择原则:
当数据分散在多个分片时:
-- 常规方案(可能不准确) (SELECT * FROM users_shard1 ORDER BY score DESC LIMIT 100) UNION ALL (SELECT * FROM users_shard2 ORDER BY score DESC LIMIT 100) ... ORDER BY score DESC LIMIT 100; -- 更优方案:使用分布式中间件或预先汇总
对频繁访问的"热数据":
-- 将热点数据存入Redis有序集合 ZADD hot_users <timestamp> <user_json> ZREVRANGE hot_users 0 99 -- 获取最新100条
-- 错误方法(全表扫描) SELECT * FROM logs ORDER BY RAND() LIMIT 100; -- 高效随机采样(假设有自增ID) SELECT * FROM logs WHERE id IN ( SELECT FLOOR(RAND() * MAX(id)) FROM logs LIMIT 100 );
-- 使用CTE(Common Table Expression)减少重复计算 WITH latest_data AS ( SELECT * FROM sensor_data WHERE device_id = 123 ORDER BY timestamp DESC LIMIT 1000 ) SELECT * FROM latest_data ORDER BY value DESC LIMIT 100;
反例:
// 先查100个订单 List<Order> orders = dao.query("SELECT * FROM orders LIMIT 100"); // 然后为每个订单查用户信息(产生101次查询) orders.forEach(order -> { order.setUser(userDao.getById(order.userId)); });
优化方案:
-- 使用JOIN一次获取 SELECT o.*, u.name, u.avatar FROM orders o JOIN users u ON o.user_id = u.id LIMIT 100;
下次遇到查询性能问题时,对照这个清单检查:
回到开头的故事,小王通过以下优化将查询从3秒降到了50毫秒:
数据库优化没有银弹,需要结合具体业务场景,建议在开发阶段就建立性能基准,当数据量增长10倍时,你会感谢现在的自己。
(本文方法基于MySQL 8.0和PostgreSQL 14验证,其他数据库可能需要调整语法)
本文由 秋飞绿 于2025-07-30发表在【云服务器提供商】,文中图片由(秋飞绿)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/489385.html
发表评论