📖 Scenario: You are managing a small online bookstore database. You want to speed up searches that filter books by both author and publication year.
🎯 Goal: Create a table called books with columns for id, title, author, and year. Then add a composite index on author and year to improve search speed.
📋 What You'll Learn
Create a table named books with columns id (integer primary key), title (varchar 100), author (varchar 50), and year (integer).
Add a composite index named idx_author_year on the author and year columns.
Write a query that uses the composite index to find all books by author 'Jane Austen' published in 1813.
Ensure the final table and index creation statements are correct and the query uses the index.
💡 Why This Matters
🌍 Real World
Composite indexes are used in real databases to speed up searches that filter on multiple columns, such as finding books by author and year.
💼 Career
Database administrators and backend developers often create composite indexes to optimize query performance in applications.
Progress0 / 4 steps
1
Create the books table
Write a SQL statement to create a table called books with these columns: id as an integer primary key, title as varchar(100), author as varchar(50), and year as integer.
MySQL
Hint
Use CREATE TABLE books and define each column with its type. Make id the primary key.
2
Add a composite index on author and year
Write a SQL statement to add a composite index named idx_author_year on the author and year columns of the books table.
MySQL
Hint
Use CREATE INDEX idx_author_year ON books (author, year); to create the composite index.
3
Write a query using the composite index
Write a SQL query to select all columns from books where author is 'Jane Austen' and year is 1813. Use the composite index you created.
MySQL
Hint
Use SELECT * FROM books WHERE author = 'Jane Austen' AND year = 1813; to use the composite index.
4
Complete the database setup with the composite index
Ensure the full SQL script includes the CREATE TABLE statement, the CREATE INDEX idx_author_year ON books (author, year); statement, and the query selecting books by 'Jane Austen' published in 1813.
MySQL
Hint
Make sure all parts are included in the final script.
Practice
(1/5)
1. What is the main purpose of a composite index in MySQL?
easy
A. To create a backup of the database automatically
B. To speed up queries that filter or sort by multiple columns together
C. To store data in multiple tables simultaneously
D. To encrypt data in multiple columns
Solution
Step 1: Understand what an index does
An index helps MySQL find data faster by organizing it for quick lookup.
Step 2: Understand composite index purpose
A composite index uses multiple columns together to speed up queries that filter or sort by those columns combined.
Final Answer:
To speed up queries that filter or sort by multiple columns together -> Option B
Quick Check:
Composite index = speed up multi-column queries [OK]
Hint: Composite indexes speed up multi-column filters and sorts [OK]
Common Mistakes:
Thinking composite indexes store data
Confusing indexes with backups
Assuming encryption is related to indexes
2. Which of the following is the correct syntax to create a composite index on columns first_name and last_name in a table users?
easy
A. CREATE INDEX idx_name ON users (first_name, last_name);
B. CREATE INDEX idx_name ON users first_name, last_name;
C. CREATE INDEX idx_name (first_name, last_name) ON users;
D. CREATE INDEX idx_name ON users WHERE first_name, last_name;
Solution
Step 1: Recall correct CREATE INDEX syntax
The syntax is: CREATE INDEX index_name ON table_name (column1, column2);
Step 2: Match syntax with options
CREATE INDEX idx_name ON users (first_name, last_name); matches the correct syntax with parentheses around columns and ON keyword before table name.
Final Answer:
CREATE INDEX idx_name ON users (first_name, last_name); -> Option A
Quick Check:
CREATE INDEX ... ON table (columns) [OK]
Hint: Use parentheses around columns after ON table_name [OK]
Common Mistakes:
Omitting parentheses around columns
Placing columns before ON keyword
Using WHERE instead of column list
3. Given a composite index on (city, age) in a table people, which query will use the index efficiently?
medium
A. SELECT * FROM people WHERE city = 'Paris' AND age = 30;
B. SELECT * FROM people WHERE age = 30;
C. SELECT * FROM people WHERE age BETWEEN 20 AND 40;
D. SELECT * FROM people WHERE city LIKE '%Paris%' ORDER BY age DESC;
Solution
Step 1: Understand composite index column order
The index is on (city, age), so queries filtering city first then age use it best.
Step 2: Analyze queries for index usage
SELECT * FROM people WHERE city LIKE '%Paris%' ORDER BY age DESC;: LIKE '%Paris%' prevents index use due to leading wildcard. SELECT * FROM people WHERE age = 30;: filters only age (second column), skips prefix. SELECT * FROM people WHERE age BETWEEN 20 AND 40;: range on age only, cannot use prefix. SELECT * FROM people WHERE city = 'Paris' AND age = 30;: city then age equality matches prefix perfectly.
Final Answer:
SELECT * FROM people WHERE city = 'Paris' AND age = 30; -> Option A
Quick Check:
Filter starts with first index column = SELECT * FROM people WHERE city = 'Paris' AND age = 30; [OK]
Hint: Filter starting with first index column uses composite index best [OK]
Common Mistakes:
Assuming any column filter uses composite index fully
Ignoring column order in composite index
Thinking ORDER BY always uses composite index
4. You created a composite index on (department, salary) but your query SELECT * FROM employees WHERE salary > 50000; is slow. What is the likely problem?
medium
A. The table has no data
B. The index syntax was incorrect
C. Composite indexes cannot be used with numeric columns
D. The query does not filter on the first column of the composite index
Solution
Step 1: Recall composite index usage rules
Composite indexes work best when queries filter starting from the first indexed column.
Step 2: Analyze the query and index
The index is on (department, salary), but query filters only salary (second column), so index is not used efficiently, causing slowness.
Final Answer:
The query does not filter on the first column of the composite index -> Option D
Quick Check:
Filter must start with first index column [OK]
Hint: Filter must include first index column to use composite index [OK]
Common Mistakes:
Assuming any column filter uses composite index
Blaming syntax without checking query
Thinking numeric columns can't be indexed
5. You have a table orders with columns customer_id, order_date, and status. You often run this query: SELECT * FROM orders WHERE customer_id = 123 AND status = 'shipped' ORDER BY order_date DESC; Which composite index will optimize this query best?
hard
A. CREATE INDEX idx_order_date_customer_status ON orders (order_date, customer_id, status);
B. CREATE INDEX idx_status_customer_date ON orders (status, customer_id, order_date);
C. CREATE INDEX idx_customer_status_date ON orders (customer_id, status, order_date);
D. CREATE INDEX idx_customer_order_date ON orders (customer_id, order_date);
Solution
Step 1: Identify query filter and order columns
The query filters by customer_id and status, then orders by order_date descending.
Step 2: Choose index column order for best performance
Index should start with columns used in WHERE filters in order: customer_id, then status, then order_date for ORDER BY.
Step 3: Match index options
CREATE INDEX idx_customer_status_date ON orders (customer_id, status, order_date); matches this order exactly, so it optimizes filtering and ordering best.
Final Answer:
CREATE INDEX idx_customer_status_date ON orders (customer_id, status, order_date); -> Option C
Quick Check:
Index columns match WHERE then ORDER BY order [OK]
Hint: Index columns order: filter columns first, then order column [OK]
Common Mistakes:
Putting ORDER BY column before filter columns
Ignoring filter columns order
Creating index missing important filter column
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.