I have a table sales
with a compound index on (user_id, eastern_date, state)
CREATE TABLE sales (
id int not null auto_increment,
user_id int not null,
eastern_date date not null,
state varchar not null,
sales_count int not null,
sales_amount float not null,
UNIQUE KEY `user_date_state` (`user_id`, `eastern_date`, `state`)
...
)
Total number of rows is ~ 60MM
I then explain a query on it for 3400 records
explain
select * from sales
where (`user_id`, `eastern_date`, `state`) IN (
(1, "2022-01-01", "NY"),
... 3399 more tuples
)
And it shows me that it uses the index user_date_state
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | sales | "pmin p2020 p2021 p2022 p2023 p2024 p2025 p2026 pmax" | range | user_date_state | user_date_state | 309 | NULL | 3400 | 100.00 | "Using where" |
I then explain a query on it for 3401 rows (1 more match) and it no longer uses the index.
explain
select * from sales
where (`user_id`, `eastern_date`, `state`) IN (
(1, "2022-01-01", "NY"),
... 3400 more tuples (1 more match)
)
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | sales | "pmin p2020 p2021 p2022 p2023 p2024 p2025 p2026 pmax" | range | user_date_state | NULL | NULL | NULL | 60000000 | 50.00 | "Using where" |
I then include a FORCE INDEX
clause
explain
select * from sales
FORCE INDEX (user_date_state)
where (`user_id`, `eastern_date`, `state`) IN (
(1, "2022-01-01", "NY"),
... 3400 more tuples (1 more match)
)
but it still does not use the index which seems to indicate that force index did not change anything. What am I missing? (Thank you)
I am using version 5.7.mysql_aurora.2.09.1 and the table is an INNODB table.