How do you write efficient and optimized SQL queries?
Arpit Nuwal

 

Best Practices for Writing Efficient & Optimized SQL Queries

Writing efficient SQL queries ensures faster execution, reduced server load, and better scalability. Here’s how to optimize your SQL queries like a pro.


1️⃣ Use SELECT Only What You Need 🎯

βœ… Avoid SELECT * (retrieving all columns slows queries).
βœ… Fetch only necessary columns to improve performance.

πŸ”Ή Bad Example:

sql
SELECT * FROM users;

πŸ”Ή Good Example:

sql
SELECT id, name, email FROM users;

2️⃣ Use Proper Indexing πŸ“Œ

βœ… Indexes speed up WHERE, JOIN, and ORDER BY operations.
βœ… Use PRIMARY KEY, UNIQUE, and FOREIGN KEY indexes.
βœ… Avoid indexing small tables or columns with high duplicate values.

πŸ”Ή Example (Creating an Index):

sql
CREATE INDEX idx_user_email ON users(email);

πŸ”Ή Check Existing Indexes:

sql
SHOW INDEXES FROM users;

3️⃣ Use WHERE Instead of HAVING πŸš€

βœ… WHERE filters before aggregation, HAVING filters after.
βœ… Use HAVING only for aggregate functions.

πŸ”Ή Bad Example:

sql
SELECT department, COUNT(*) FROM employees GROUP BY department HAVING department = 'IT';

πŸ”Ή Good Example:

sql
SELECT department, COUNT(*) FROM employees WHERE department = 'IT' GROUP BY department;

4️⃣ Avoid Unnecessary Joins & Use EXISTS Instead of IN πŸ”„

βœ… Minimize JOINs, as they slow down queries.
βœ… Use EXISTS instead of IN for better performance on large datasets.

πŸ”Ή Bad Example (Using IN):

sql
SELECT name FROM employees WHERE department_id IN (SELECT id FROM departments WHERE name = 'IT');

πŸ”Ή Good Example (Using EXISTS):

sql
SELECT name FROM employees e WHERE EXISTS (SELECT 1 FROM departments d WHERE d.id = e.department_id AND d.name = 'IT');

5️⃣ Use LIMIT for Large Datasets πŸ”₯

βœ… Fetch only required rows instead of pulling all data.

πŸ”Ή Example:

sql
SELECT * FROM orders ORDER BY order_date DESC LIMIT 100;

6️⃣ Optimize JOINS & Choose the Right Type 🏎️

βœ… Use INNER JOIN instead of LEFT/RIGHT JOIN when possible.
βœ… Ensure JOIN keys are indexed.

πŸ”Ή Example:

sql
SELECT e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.id;

7️⃣ Use UNION ALL Instead of UNION (If Possible) πŸš€

βœ… UNION removes duplicates, making it slower.
βœ… If duplicates aren’t an issue, use UNION ALL.

πŸ”Ή Bad Example:

sql
SELECT name FROM employees WHERE role = 'Manager' UNION SELECT name FROM clients WHERE category = 'Premium';

πŸ”Ή Good Example:

sql
SELECT name FROM employees WHERE role = 'Manager' UNION ALL SELECT name FROM clients WHERE category = 'Premium';

8️⃣ Use Stored Procedures for Repeated Queries πŸ“¦

βœ… Stored procedures execute faster as they are precompiled.
βœ… They reduce SQL injection risks.

πŸ”Ή Example (Creating a Stored Procedure):

sql
CREATE PROCEDURE GetEmployee(IN emp_id INT) BEGIN SELECT * FROM employees WHERE id = emp_id; END;

πŸ”Ή Calling the Procedure:

sql
CALL GetEmployee(101);

9️⃣ Avoid SELECT N+1 Query Problem 🚨

βœ… Fetch related data in a single query instead of multiple queries.

πŸ”Ή Bad Example:

sql
SELECT * FROM departments; SELECT * FROM employees WHERE department_id = 1; SELECT * FROM employees WHERE department_id = 2;

πŸ”Ή Good Example (Using JOIN):

sql
SELECT d.name, e.name FROM departments d LEFT JOIN employees e ON d.id = e.department_id;

πŸ”Ÿ Optimize ORDER BY & GROUP BY

βœ… Index the columns used in ORDER BY and GROUP BY for speed.
βœ… Avoid ordering unindexed columns.

πŸ”Ή Bad Example:

sql
SELECT name FROM employees ORDER BY salary;

πŸ”Ή Good Example:

sql
CREATE INDEX idx_salary ON employees(salary); SELECT name FROM employees ORDER BY salary;

πŸš€ Bonus: Use Query Execution Plans for Optimization

πŸ”Ή Check how your query runs and optimize accordingly:

sql
EXPLAIN SELECT * FROM employees WHERE department_id = 5;

🎯 Final Thoughts

πŸ”Ή Use SELECT only required columns
πŸ”Ή Index frequently queried columns
πŸ”Ή Avoid HAVING when WHERE can be used
πŸ”Ή Use EXISTS instead of IN
πŸ”Ή Optimize JOINs and GROUP BY