サブクエリ1:避け "filesortレコード"
SELECT * from big_table
where category = 'fruits' and name = 'apple'
order by yyyymmdd desc
説明:
table | key | extra
big_table | name_yyyymmdd | using where
は素晴らしい見えます!
サブクエリ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
は説明:それはfilesortレコードを使用して、
table | key | extra
big_table | name | using index condition, using where
big_table | category | using index condition
UNION RESULT| NULL | using temporary; using filesort
あまりよくありません。
これは、より多くの複合化クエリのトリムダウンバージョンである、ここでbig_tableに関するいくつかの事実は以下のとおりです。
- big_tableは10M +行
- を持っている5つのユニークな「カテゴリ」の
- がありあります。約10,000ユニークな「名前」の
- 約10,000ユニークな「YYYYMMDD」の
- 私はCを持っているがありますがあります5独特の「味」の
- ですそれらのフィールドのそれぞれにreated単一インデックスと
yyyymmdd_category_taste_name
のような複合idxがありますが、Mysqlはそれを使用していません。
もう1つのこと... "filesort"は悪ではありません。クエリの複雑さです。 –