次のクエリを最適化するには、助けが必要です。
SELECT
kd2c.id as _id,
kd2c.literal as kanji
FROM
kd2_character as kd2c
JOIN krad_components as kcom ON kcom.kanji_fk = kd2c.id
WHERE kcom.radical_fk IN (1, 2, 3, etc...)
GROUP BY kd2c.id HAVING count(distinct kcom.radical_fk) = <number of integers in WHERE clause>
ORDER BY kd2c.freq IS NULL ASC, kd2c.freq, kd2c.id
クエリ自体は (句内の fk の数に関係なくWHERE
) 実行に 0.04 秒かかります。これは、約 0.0003 秒かかる他のすべてのクエリに比べて長い時間です。私はEXPLAIN QUERY PLAN
上記の声明に対して反論を行い、以下を受け取りました。
# | selectid | order | from | detail
1 0 0 0 SCAN TABLE kd2_character AS kd2c USING INTEGER PRIMARY KEY (~1000000 rows)
2 0 1 1 SEARCH TABLE krad_components AS kcom USING COVERING INDEX idx_krad_components (kanji_fk=? AND radical_fk=?) (~9 rows)
3 0 0 0 EXECUTE LIST SUBQUERY 1
4 0 0 0 USE TEMP B-TREE FOR ORDER BY
そのイニシャルが原因で、スクリプトに非常に時間がかかると確信していますSCAN TABLE
。もしそうなら、どうすればそれを取り除くことができますか?インデックスを作成するとうまくいくと思いましたkd2_characer.id
が、実行時間に目立った影響はありませんでした。
このクエリを改善するにはどうすればよいですか? GROUP BY
おそらくのソースなので、my を構造化するより良い方法はありSCAN
ますか?