LEFT JOINSが5つまたは6つのmysqlクエリがあります。予想どおり、これはかなり遅いです。 〜100の結果しか期待していないことを考慮すると、たくさんの別々のSQLクエリを実行して、手動でそれらを一緒にステッチする方が意味があるかもしれません。私はそれが複数の左の結合で作成された巨大なテーブルのために長い時間がかかると思っています。そうですか?LEFT JOINのパフォーマンスを向上させる
私はこれをRails 3でやっています。アクティブなレコードを作成するのは費用がかかりますが、LEFT JOINSが非常に多くあるよりも速いかもしれないと思います。私はデータベースがどのようにしてフードの下で動作するかについてほとんど知っていません。どんな洞察にも本当に感謝します。
編集:ここでは実際のクエリとテーブルのスキーマがあります
クエリ
SELECT
people
*people
左からはperson_organization_relationships
.person_id =people
.ID ONperson_organization_relationships
とperson_organization_relationships
を登録しよう。 stop_person IS NULL LEFT JOINperson_redirect_relationships
AS r_from_others ON r_from_others.parent_id =people
.IDとr_from_others.stop_personが NULL残っているが r_to_others.child_id =people
.ID ON r_to_others ASperson_redirect_relationships
に参加しr_to_others.stop_personは LEFT NULL IS r_p_check.person_id = r_from_others ON AS r_p_checkperson_organization_relationships
を登録しよう。 child_idとr_p_check.stop_person はNULLのままにr_o_check.child_id ON AS r_o_checkorganization_redirect_relationships
を登録しよう=person_organization_relationships
.organization_idと r_o_check.stop_organizationは rr_p_check.person_id = r_from_others.child_i ON rr_p_check ASperson_organization_relationships
を登録しようNULL残っていますDおよび rr_p_check.stop_person rr_p_check.organization_id = rr_o_check.child_id ON rr_o_check ASorganization_redirect_relationships
に入会すると、WHERE (((person_organization_relationships
.organization_id = 1 OR r_o_check.parent_id = 1)AND r_to_others rr_o_check.stop_organizationがNULL IS NULL残され:.parent_idはNULL)ORcreate_table "people", :force => true do |t| t.datetime "created_at" t.datetime "updated_at" t.boolean "delta", :default => true, :null => false end create_table "person_organization_relationships", :force => true do |t| t.integer "person_id" t.integer "organization_id" t.integer "start_person" t.integer "stop_person" t.datetime "created_at" t.datetime "updated_at" end add_index "person_organization_relationships", ["organization_id"], :name => "index_person_organization_relationships_on_organization_id" add_index "person_organization_relationships", ["person_id"], :name => "index_person_organization_relationships_on_person_id" add_index "person_organization_relationships", ["start_person"], :name => "index_person_organization_relationships_on_start_person" add_index "person_organization_relationships", ["stop_person"], :name => "index_person_organization_relationships_on_stop_person" create_table "person_redirect_relationships", :force => true do |t| t.integer "parent_id" t.integer "child_id" t.integer "start_person" t.integer "stop_person" t.datetime "created_at" t.datetime "updated_at" end add_index "person_redirect_relationships", ["child_id"], :name => "index_person_redirect_relationships_on_child_id" add_index "person_redirect_relationships", ["parent_id"], :name => "index_person_redirect_relationships_on_parent_id" add_index "person_redirect_relationships", ["start_person"], :name => "index_person_redirect_relationships_on_start_person" add_index "person_redirect_relationships", ["stop_person"], :name => "index_person_redirect_relationships_on_stop_person" create_table "organization_redirect_relationships", :force => true do |t| t.integer "parent_id" t.integer "child_id" t.integer "start_organization" t.integer "stop_organization" t.datetime "created_at" t.datetime "updated_at" end add_index "organization_redirect_relationships", ["child_id"], :name => "index_organization_redirect_relationships_on_child_id" add_index "organization_redirect_relationships", ["parent_id"], :name => "index_organization_redirect_relationships_on_parent_id" add_index "organization_redirect_relationships", ["start_organization"], :name => "index_organization_redirect_relationships_on_start_organization" add_index "organization_redirect_relationships", ["stop_organization"], :name => "index_organization_redirect_relationships_on_stop_organization"
people
が
テーブルスキーマを.ID BY(r_p_check.organization_id = 1 OR rr_o_check.parent_id = 1))基であります
このクエリでは結果は得られませんでした。
+ ---- + ------------- + ------------------------ ----------- + -------- + ----------------------------- -------------------------------------------------- --------------------------------------- + ---------- --------------------------------------------- + ---- ----- + -------------------------------------------- ---------------------------- + ------ + -------------- ------------------- + | id | select_type |テーブル|タイプ| possible_keys
|キー| key_len | ref
|行|余分な| + ---- + ------------- + ----------------------------- ------ + -------- + ---------------------------------- -------------------------------------------------- ---------------------------------- + --------------- ---------------------------------------- + --------- + ------------------------------------------------- ----------------------- + ------ + ------------------- -------------- + | 1 |シンプル| person_details |すべて| index_person_details_on_current_p_id
| NULL | NULL | NULL
| 4938 |一時的な使用。 filesortの使用| | 1 |シンプル|人々 | eq_ref | PRIMARY
| PRIMARY | 4 | knolcano_development.person_details.current_p_id
| 1 | | | 1 |シンプル| person_organization_relationships | ref | index_person_organization_relationships_on_person_id、index_person_organization_relationships_on_stop_person | index_person_organization_relationships_on_person_id | 5 | knolcano_development.person_details.current_p_id
| 1 | | | 1 |シンプル| r_from_others | ref | index_person_redirect_relationships_on_parent_id、index_person_redirect_relationships_on_stop_person | index_person_redirect_relationships_on_stop_person | 5 | const
| 3 | | | 1 |シンプル| r_to_others | ref | index_person_redirect_relationships_on_child_id、index_person_redirect_relationships_on_stop_person | index_person_redirect_relationships_on_child_id | 5 | knolcano_development.people.id
| 2 | | | 1 |シンプル| r_p_check | ref | index_person_organization_relationships_on_person_id、index_person_organization_relationships_on_stop_person | index_person_organization_relationships_on_person_id | 5 | knolcano_development.r_from_others.child_id
| 1 | | | 1 |シンプル| r_o_check | ref | index_organization_redirect_relationships_on_child_id、index_organization_redirect_relationships_on_stop_organization | index_organization_redirect_relationships_on_child_id | 5 | knolcano_development.person_organization_relationships.organization_id | 1 | | | 1 |シンプル| rr_p_check | ref | index_person_organization_relationships_on_person_id、index_person_organization_relationships_on_stop_person | index_person_organization_relationships_on_person_id | 5 | knolcano_development.r_from_others.child_id
| 1 | | | 1 |シンプル| rr_o_check | ref | index_organization_redirect_relationships_on_child_id、index_organization_redirect_relationships_on_stop_organization | index_organization_redirect_relationships_on_child_id | 5 | knolcano_development.rr_p_checkorganization_id
| 1 |どこで使う| + ---- + ------------- + ----------------------------- ------ + -------- + ---------------------------------- -------------------------------------------------- ---------------------------------- + --------------- ---------------------------------------- + --------- + ------------------------------------------------- ----------------------- + ------ + ------------------- -------------- + 9行のセット(0.00秒)
しかし、クエリを実行したときには0.14秒かかりました。それは長い時間ですか? memcachedを実装する前に良いクエリがあるかどうかを調べようとしています。
実際のクエリとEXPLAIN出力は、参考になる情報です。 –
私は@JoeStefanelliに同意します。 'EXPLAIN'のクエリ+結果を表示します。 – Tadeck