我正在尝试优化 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”表中的记录数增加,它也会表现良好?