6 min read
•Question 23 of 29hardHow do you optimize SQL query performance?
Query optimization techniques.
What You'll Learn
- Query analysis
- Optimization techniques
- Best practices
Analyze Queries
query.sqlSQL
-- MySQL
EXPLAIN SELECT * FROM users WHERE email = 'john@example.com';
EXPLAIN ANALYZE SELECT * FROM users WHERE status = 'active';
-- PostgreSQL
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE id = 1;Indexing
query.sqlSQL
-- Create indexes for frequently queried columns
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
-- Covering index (includes all needed columns)
CREATE INDEX idx_users_status ON users(status) INCLUDE (name, email);Query Optimization
query.sqlSQL
-- Avoid SELECT *
SELECT id, name, email FROM users; -- Good
SELECT * FROM users; -- Bad
-- Use specific conditions
SELECT * FROM orders WHERE user_id = 5; -- Good (uses index)
SELECT * FROM orders WHERE YEAR(created_at) = 2024; -- Bad (function on column)
-- Rewrite for index usage
SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';JOINs vs Subqueries
query.sqlSQL
-- Often better
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id;
-- Can be slower
SELECT u.name, (SELECT SUM(total) FROM orders WHERE user_id = u.id)
FROM users u;Batch Operations
query.sqlSQL
-- Insert multiple rows at once
INSERT INTO users (name, email) VALUES
('John', 'john@example.com'),
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');
-- Update in batches
UPDATE users SET status = 'inactive' WHERE id IN (1, 2, 3, 4, 5);Other Tips
- Limit result sets with LIMIT
- Avoid DISTINCT if not needed
- Use EXISTS instead of COUNT for existence checks
- Partition large tables
- Denormalize for read-heavy workloads