Hi, I have a table "orders" with the columns

  item_id INT FK items(id)
  customer_id INT FK customers(id)
  status_id TINYINT -- Between 1 and 4 always
  ordered_at DATETIME
  delivered_at DATETIME

There are indexes:

  index_a: (item_id, customer_id, status_id)
  index_b: (item_id, status_id, ordered_at, delivered_at)

Given this query:

SELECT * FROM orders WHERE item_id = 9602 AND customer_id = 5531 AND status_id IN (1,2)

Then the key chosen is index_b. Same happens if I use (status_id = 1 OR status_id = 2). If I only check against one status_id, then the "correct" index_a gets picked with ref const,const,const.

I'm not even doing a range scan on status_id and even if I were, it's the last column in index_a. Since ordered_at and delivered_at are both dates then index_b will have a very high selectivity. In reality, index_b may make little sense, but I still don't understand why MySQL would ever pick that when 3 columns in the query can use the covering index_a

Can anyone give me some input on how to make sense of this?

Thanks,

Morten

select count(*) from orders where item_id = 9602 -> 4534 records
select count(*) from orders where item_id = 9602 and status_id IN (1,2) -> 4181 records select count(*) from orders where item_id = 9602 and customer_id = 5531 -> 1226 records select count(*) from orders where item_id = 9602 and customer_id = 5531 and status_id IN (1,2) -> 1174 records



--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/mysql?unsub=arch...@jab.org

Reply via email to