Sub-запрос 1:Избегайте "FileSort" на UNION РЕЗУЛЬТАТ
SELECT * from big_table
where category = 'fruits' and name = 'apple'
order by yyyymmdd desc
Объясните:
table | key | extra
big_table | name_yyyymmdd | using where
Выглядит здорово!
Sub-запрос 2:
SELECT * from big_table
where category = 'fruits' and (taste = 'sweet' or wildcard = '*')
order by yyyymmdd desc
Объясните:
table | key | extra
big_table | category_yyyymmdd | using where
Выглядит здорово!
Теперь, если я объединить тех, с UNION:
SELECT * from big_table
where category = 'fruits' and name = 'apple'
UNION
SELECT * from big_table
where category = 'fruits' and (taste = 'sweet' or wildcard = '*')
Order by yyyymmdd desc
Объясните:
table | key | extra
big_table | name | using index condition, using where
big_table | category | using index condition
UNION RESULT| NULL | using temporary; using filesort
Не так хорошо, он использует FileSort.
Это урезана версия более в комплекс запроса, вот некоторые факты о big_table:
- big_table имеет 10M + строки
- Там находятся 5 уникальной «категории» s
- Там являются 5 уникального «вкус» s
- есть около 10000 уникального «имени» s
- есть около 10000 уникальных «ггггммдда» s
- Я имею гр один индекс в каждом из этих полей, плюс составной idx, такой как
yyyymmdd_category_taste_name
, но Mysql его не использует.
Еще одна вещь ... «filesort» - это не зло; сложность запроса. –