2

私が取り組んでいる Web ページでは、3 つのテーブルにあるさまざまなユーザーの詳細に基づいて統計を表示する必要があります。したがって、より多くの異なるテーブルに結合する次のクエリがあります。

SELECT *
FROM `user` `u`
LEFT JOIN `subscriptions` `s` ON `u`.`user_id` = `s`.`user_id`
LEFT JOIN `devices` `ud` ON `u`.`user_id` = `ud`.`user_id`
GROUP BY `u`.`user_id`

クエリを実行すると、約0.05LIMIT 1000秒かかります。多くのクエリで 3 つのテーブルすべてのデータを使用しているため、次の中に配置することにしました。VIEW

CREATE VIEW `user_details` AS ( the same query from above )

そして今、私が実行すると:

SELECT * FROM user_details LIMIT 1000

7〜10秒かかります。

だから私の質問は、ビューを最適化するために何かできることはありますか?

編集:これがEXPLAIN SELECT * FROM user_details返されるものです

+----+-------------+------------+--------+----------------+----------------+---------+------------------------+--------+-------+
| id | select_type | table      | type   | possible_keys  | key            | key_len | ref                    | rows   | Extra |
+----+-------------+------------+--------+----------------+----------------+---------+------------------------+--------+-------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL           | NULL           | NULL    | NULL                   | 322666 |       |
|  2 | DERIVED     | u          | index  | NULL           | PRIMARY        | 4       | NULL                   | 372587 |       |
|  2 | DERIVED     | s          | eq_ref | PRIMARY        | PRIMARY        | 4       | db_users.u.user_id     |      1 |       |
|  2 | DERIVED     | ud         | ref    | device_id_name | device_id_name | 4       | db_users.u.user_id     |      1 |       |
+----+-------------+------------+--------+----------------+----------------+---------+------------------------+--------+-------+

4 行セット (8.67 秒)

これはexplain、クエリに対して返されるものです。

+----+-------------+-------+--------+----------------+----------------+---------+------------------------+--------+-------+
| id | select_type | table | type   | possible_keys  | key            | key_len | ref                    | rows   | Extra |
+----+-------------+-------+--------+----------------+----------------+---------+------------------------+--------+-------+
|  1 | SIMPLE      | u     | index  | NULL           | PRIMARY        | 4       | NULL                   | 372587 |       |
|  1 | SIMPLE      | s     | eq_ref | PRIMARY        | PRIMARY        | 4       | db_users.u.user_id     |      1 |       |
|  1 | SIMPLE      | ud    | ref    | device_id_name | device_id_name | 4       | db_users.u.user_id     |      1 |       |
+----+-------------+-------+--------+----------------+----------------+---------+------------------------+--------+-------+

3 行セット (0.00 秒)

4

1 に答える 1

4

パフォーマンスに関して言えば、ビューと結合は非常に悪いです。これは、ほぼすべてのリレーショナル データベース管理システムに当てはまります。これらのシステムはそのように設計されているため、奇妙に聞こえますが、それでも真実です。

これがページで頻繁に使用されるクエリである場合は、結合を避けるようにしてください。代わりに、3 つのテーブルから埋められる実際のテーブル (ビューではない) を作成してください。トリガーを使用してそのプロセスを自動化できます。そのため、エントリが元のテーブルの 1 つに挿入されるたびに、トリガーはデータが物理user_detailsテーブルに伝播されるようにします。

この戦略は確かにセットアップのための 1 回限りの投資を意味しますが、確実にはるかに優れたパフォーマンスが得られます。

于 2013-01-21T10:40:32.013 に答える