MySql でビューを最適化しようとしています。ビューは、テーブルから 0 ~ 5 個のレコードを取得し、それらを 1 つのレコードに変換します。ビューは機能しますが、property_log テーブルのレコード数が増えるにつれて速度が低下します。
たとえば、次のようなデータです。
mysql> select * from property_log where event_id = 1144882;
+----------+--------------+------------------------------+
| event_id | log_key | log_value |
+----------+--------------+------------------------------+
| 1144882 | userId | 1000 |
| 1144882 | licenseId | 3 |
| 1144882 | messageTypeId| 7 |
| 1144882 | message | Sample message |
| 1144882 | op | tracking |
+----------+--------------+------------------------------+
1 つのレコードに変換されます:
mysql> select * from view_logged_property where id = 1144882
+---------+--------+-----------+---------------+-------------------+
| ID | UserID | LicenseID | MessageTypeID | Message |
+---------+--------+-----------+---------------+-------------------+
| 1144882 | 1000 | 3 | 7 | Sample message |
+---------+--------+-----------+---------------+-------------------+
編集: 重要な注意 - 5 つのレコードすべてが常に存在するわけではありません。たとえば、データは次のようにもなります。
mysql> select * from property_log where event_id = 1144882;
+----------+--------------+------------------------------+
| event_id | log_key | log_value |
+----------+--------------+------------------------------+
| 1144882 | userId | 1000 |
| 1144882 | messageTypeId| 7 |
| 1144882 | message | Sample message |
| 1144882 | op | tracking |
+----------+--------------+------------------------------+
これを行うために現在使用しているビューは次のとおりです。
DROP VIEW IF EXISTS view_logged_property;
CREATE VIEW view_logged_property as (
SELECT
p.event_id as ID,
(select log_value from property_log where log_key = "userId" and event_id = p.event_id) as UserID,
(select log_value from property_log where log_key = "licenseId" and event_id = p.event_id) as LicenseID,
(select log_value from property_log where log_key = "messageTypeId" and event_id = p.event_id) as MessageTypeID,
(select log_value from property_log where log_key = "message" and event_id = p.event_id) as Message
FROM
logging_event p
WHERE
p.event_id in (select event_id from property_log where log_key = "op" and log_value = "tracking")
);
「property_log」テーブルのレコード数が増えてもパフォーマンスが向上するように、このビューを記述する最良の方法は何ですか?