2026北京黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
2026/6/30 5:02:22
这是优化查询速度的第一道关卡,很多慢查询问题根源就在 SQL 写法上:
SELECT *sql
-- 差的写法 SELECT * FROM user WHERE id > 100; -- 优的写法 SELECT id, name, phone FROM user WHERE id > 100;sql
-- 差的写法(函数操作字段) SELECT * FROM order WHERE DATE(create_time) = '2025-12-24'; -- 优的写法(条件值预处理) SELECT * FROM order WHERE create_time BETWEEN '2025-12-24 00:00:00' AND '2025-12-24 23:59:59';sql
-- 差的写法(子查询) SELECT * FROM user WHERE id IN (SELECT user_id FROM order WHERE amount > 1000); -- 优的写法(JOIN) SELECT DISTINCT u.* FROM user u JOIN `order` o ON u.id = o.user_id WHERE o.amount > 1000;ORDER BY RAND()和无限制的排序ORDER BY RAND()会全表扫描 + 随机排序,效率极差;排序时确保排序字段有索引,且只排序必要数据。sql
-- 差的写法(全表随机) SELECT * FROM product ORDER BY RAND() LIMIT 10; -- 优的写法(先查主键范围,再随机) SELECT * FROM product WHERE id BETWEEN 1 AND 10000 ORDER BY RAND() LIMIT 10;LIMIT,且结合WHERE缩小范围。从源头减少查询开销,适合表设计阶段或重构阶段:
INT/BIGINT存 ID,而非VARCHAR;DATETIME/TIMESTAMP存时间,而非VARCHAR;ENUM,而非VARCHAR(如性别:ENUM('男','女'))。当单表数据量超过 1000 万行时,即使加索引也会变慢,需分表:
order_202501、order_202502);user_base(基础信息)和user_extra(扩展信息),减少单表字段数)。NULL。NULL会增加索引和查询的开销(MySQL 需特殊处理 NULL 值),且聚合函数(如COUNT())会忽略 NULL 值,易出错。调整 MySQL 的核心配置参数,充分利用服务器资源:
innodb_buffer_pool_size:InnoDB 的缓存池,用于缓存数据和索引,建议设置为物理内存的 50-70%(如服务器 16G 内存,设为 10G)。
sort_buffer_size:排序缓存,用于ORDER BY/GROUP BY,按需调整(不要过大,避免内存竞争);join_buffer_size:JOIN 关联缓存,优化多表连接的效率。MySQL 5.7 及以下的query_cache_size:查询缓存会缓存 SQL 语句和结果,但更新频繁的表会导致缓存频繁失效,反而拖慢速度,建议关闭(设为 0)。
适合中大型系统的进阶优化:
优化前先定位瓶颈:在查询语句前加EXPLAIN,查看 MySQL 的执行计划(是否走索引、扫描行数、连接方式等)。
sql
EXPLAIN SELECT id, name FROM user WHERE phone = '13800138000';type列(ALL= 全表扫描,ref/range/eq_ref= 走索引,越优);rows列:预估扫描行数,行数越少越好。sql
ANALYZE TABLE user;作用:更新表的统计信息(如数据分布、行数),让 MySQL 优化器生成更优的执行计划。
创建包含查询所需所有字段的索引(无需回表查询),速度比普通索引更快:
sql
-- 查询字段:id(主键)、name、phone -- 创建覆盖索引 CREATE INDEX idx_name_phone ON user(name, phone);EXPLAIN分析执行计划,定位瓶颈后再针对性优化(避免盲目加索引 / 改配置)。