1

次のクエリを最適化するには、助けが必要です。

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ますか?

4

1 に答える 1