CAST/CONVERT/DATE_FORMAT。col + 1 = 100 → col = 99。UNION ALL 利用索引。SELECT T.img_id, T.thumb_path
FROM gallery_photofiles P
LEFT JOIN gallery_thumbs T ON T.img_id = P.img_id AND T.thumb_type='11'
WHERE P.owner_user_id = '1'
AND P.img_id IN (SELECT A.img_id FROM gallery_album_img_link A WHERE A.img_id);
SELECT T.img_id, T.thumb_path
FROM gallery_photofiles P
LEFT JOIN gallery_thumbs T ON T.img_id = P.img_id AND T.thumb_type='11'
WHERE P.owner_user_id = '1'
AND (SELECT COUNT(*) FROM gallery_album_img_link A WHERE A.img_id = P.img_id) > 0;
效果:COUNT(*) 觸發半連接優化,避免物化子查詢,速度大幅提升。
SELECT * FROM t ORDER BY RAND() LIMIT 5;
-- RAND() 每行計算一次,需全表掃描+filesort,15萬行耗時 8 秒+
-- 方案 1:JOIN 子查詢 (推薦,穩定)
SELECT * FROM t AS t1
JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM t)) AS id) AS t2
ON t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
-- 方案 2:WHERE 子查詢 (簡潔)
SELECT * FROM t
WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM t)))
ORDER BY id LIMIT 1;
-- 方案 3:含 MIN/MAX 邊界修正 (防止 ID 不連續導致前段數據概率高)
SELECT * FROM t
WHERE id >= (
SELECT FLOOR(RAND() * ((SELECT MAX(id) FROM t) - (SELECT MIN(id) FROM t)) + (SELECT MIN(id) FROM t))
)
ORDER BY id LIMIT 1;
| 寫法 | 耗時 | 備註 |
|---|---|---|
| ORDER BY RAND() | 8.2 秒 | 全表掃描+排序 |
| JOIN 子查詢 (MAX) | 0.01 秒 | 索引範圍掃描 |
| WHERE 子查詢 (MAX) | 0.5 秒 | 依賴優化器轉換 |
| WHERE 子查詢 (MIN/MAX 修正) | 0.01 秒 | 均勻分佈,推薦 |
單條高效,需多條時:
IN (id1, id2...) 查詢 (需 ID 密集)。