mysql:index:composite

CREATE TABLE orders (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT UNSIGNED NOT NULL,
  STATUS VARCHAR(20) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_orders_user_status_created
ON orders (user_id, STATUS, created_at);
-- Uses (user_id, status, created_at)
SELECT *
FROM orders
WHERE user_id = 10 AND STATUS = 'paid'
ORDER BY created_at DESC
LIMIT 50;
 
-- Uses leftmost prefix (user_id)
SELECT *
FROM orders
WHERE user_id = 10
ORDER BY created_at DESC
LIMIT 50;
 
-- Uses (user_id, status) even without ordering
SELECT COUNT(*)
FROM orders
WHERE user_id = 10 AND STATUS = 'paid';
-- Missing leftmost column (user_id)
SELECT *
FROM orders
WHERE STATUS = 'paid'
ORDER BY created_at DESC;
EXPLAIN
SELECT *
FROM orders
WHERE user_id = 10 AND STATUS = 'paid'
ORDER BY created_at DESC
LIMIT 50;