MySQL Optimizerに派生テーブルのインデックスを使用するように伝えるにはどうすればよいですか?
-
30-10-2019 - |
質問
このような質問があるとします...
SELECT T.TaskID, T.TaskName, TAU.AssignedUsers
FROM `tasks` T
LEFT OUTER JOIN (
SELECT TaskID, GROUP_CONCAT(U.FirstName, ' ',
U.LastName SEPARATOR ', ') AS AssignedUsers
FROM `tasks_assigned_users` TAU
INNER JOIN `users` U ON (TAU.UserID=U.UserID)
GROUP BY TaskID
) TAU ON (T.TaskID=TAU.TaskID)
複数の人を特定のタスクに割り当てることができます。このクエリの目的は、タスクごとに1つの行を表示することですが、1つの列でタスクに割り当てられた人と一緒に
今...適切なインデックスが設定されているとします tasks
, users
, 、 と tasks_assigned_users
. 。 MySQL Optimizerは、参加時にTaskIDインデックスを使用しません tasks
派生テーブルに。 wtf?!?!?
だから、私の質問は...このクエリにtasks_assigned_users.taskidのインデックスを使用するにはどうすればよいですか?一時的なテーブルは足が不自由なので、それが唯一の解決策である場合... MySQLオプティマイザーは愚かです。
使用されるインデックス:
- タスク
- プライマリ-TaskID
- ユーザー
- プライマリ-USERID
- tasks_assigned_users
- プライマリ - (taskid、userid)
- 追加のインデックスユニーク - (userid、taskID)
編集: また、 このページ 派生テーブルは、結合が発生する前に実行/実現されていると言います。キーを再利用して結合を実行してみませんか?
編集2: MySQL Optimizerはあなたを置くことができません インデックスのヒント 派生テーブル(おそらく、派生テーブルにインデックスがないため)
編集3: これがこれについての本当に素敵なブログ投稿です: http://venublog.com/2010/03/06/how-to-improve-subqueries-derived-tables-performance/ ケース#2が私が探しているソリューションであることに注意してください。しかし、MySQLは現時点ではこれをサポートしていないようです。 :(
編集4: ちょうど見つかりました これ: :「MySQL 5.6.3の時点で、オプティマイザーはFrom句(つまり、派生テーブル)のサブクエリをより効率的に処理します:...クエリの実行中、オプティマイザーは派生テーブルにインデックスを追加して、からの行の検索をスピードアップすることができます。それ。"有望なようです...
正しい解決策はありません