次のテーブルがあります(例)
t1 (20.000 rows, 60 columns, primary key t1_id)
t2 (40.000 rows, 8 columns, primary key t2_id)
t3 (50.000 rows, 3 columns, primary key t3_id)
t4 (30.000 rows, 4 columns, primary key t4_id)
SQL クエリ:
SELECT COUNT(*) AS count FROM (t1)
JOIN t2 ON t1.t2_id = t2.t2_id
JOIN t3 ON t2.t3_id = t3.t3_id
JOIN t4 ON t3.t4_id = t4.t4_id
結合に影響する列 (例: t1.t2_id
) と必要に応じて外部キーにインデックスを作成しました。クエリが遅く (600 ミリ秒)、where 句 (たとえばWHERE t1.column10 = 1
、 wherecolumn10
にインデックスがない) を配置すると、クエリが大幅に遅くなります。私が行うクエリは高速であり、カウント動作を理解できませんselect (*)
。LIMIT
解決策はありますか?
編集:追加されたSQLの説明
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t4 index PRIMARY user_id 4 NULL 5259 Using index
1 SIMPLE t2 ref PRIMARY,t4_id t4_id 4 t4.t4_id 1 Using index
1 SIMPLE t1 ref t2_id t2_id 4 t2.t2_id 1 Using index
1 SIMPLE t3 ref PRIMARY PRIMARY 4 t2.t2_id 1 Using index
user_id は t4 テーブルの列です
編集: innodb から myisam に変更したところ、特に where 句を配置した場合に速度が向上しました。しかし、まだ時間があります (100 ~ 150 ミリ秒) アプリケーションでカウントが必要な理由は、検索フォームを処理しているユーザーに対して、彼が ajax で期待している結果の数です。これには、1 時間ごとに更新される一時テーブルを作成するなど、より良い解決策があるのでしょうか?