Filter early: Push WHERE clauses as close to source as possible. Don't scan then filter.
Select only needed columns: SELECT * reads everything. Columnar storage benefits from column pruning.
Avoid functions on filter columns:
-- Bad: Full scan
WHERE YEAR(order_date) = 2024
-- Good: Uses partition pruning
WHERE order_date >= '2024-01-01'
AND order_date < '2025-01-01'
Use approximate functions: APPROX_COUNT_DISTINCT is faster than COUNT(DISTINCT) when exactness isn't required.
Check query plans: EXPLAIN shows what the optimizer plans. Look for full scans.