Observe the scenario below:
CREATE TABLE `sales` (
`site_key` int(11) default NULL,
`sales_date` date default NULL,
`product_key` int(11) default NULL,
`sales_amount` decimal(10,2) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- test data generation
create table gen(a1 bit(1));
insert into gen values (1),(1),(1),(0),(1),(1),(1),(1),(0),(1);
insert into sales select floor(rand()*10),
adddate('2010-01-01',
interval rand()*360 day),
rand()*5000,rand() * 1000
from gen v1,gen v2,gen v3,gen v4;
--
Which index would support the following query the best?
select sales_date,sum(sales_amount)
from sales where site_key=5 and
sales_date between '2010-01-01' and '2010-01-31'
group by sales_date;
a) create index ix1 on sales(site_key,sales_date);
b) create index ix1 on sales(sales_date,site_key);
c) create index ix1 on sales(sales_amount);
d) create index ix1 on sales(product_key);
[ Tables and Indexes (15%) - Indexes ]
Answer:
a
The amount of data can be restricted the best with option A.
Note, that the order of fields is important in a composite index!
(Columns with equality-conditions before those with range-checks)
Try to create each index and use explain to find out how many rows are accessed to get the result.
(just put “explain” in front of the query)