0

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」テーブルのレコード数が増えてもパフォーマンスが向上するように、このビューを記述する最良の方法は何ですか?

4

2 に答える 2

1

これを試して、

SELECT  Event_ID,
        MAX(CASE WHEN log_key = 'userID' THEN log_value ELSE NULL END) userID,
        MAX(CASE WHEN log_key = 'licenseId ' THEN log_value ELSE NULL END) licenseId ,
        MAX(CASE WHEN log_key = 'messageTypeId' THEN log_value ELSE NULL END) messageTypeId,
        MAX(CASE WHEN log_key = 'message' THEN log_value ELSE NULL END) message,
        MAX(CASE WHEN log_key = 'op' THEN log_value ELSE NULL END) op
FROM     property_log
GROUP BY    Event_ID
于 2012-11-28T14:37:39.543 に答える
1

joinこの場合は sを使用します。

コメント後に変更すると、left join問題が解決するはずです。

DROP VIEW IF EXISTS view_logged_property;
CREATE VIEW view_logged_property as (
    select 
        p1.event_id as ID, 
        p5.log_value as UserID, 
        p2.log_value as LicenseID, 
        p3.log_value as MessageTypeID, 
        p4.log_value as Message
    from property_log p1  
    left join property_log p5 on p1.event_id = p5.event_id and p5.log_key = 'userId'
    left join property_log p2 on p1.event_id = p2.event_id and p2.log_key = 'licenseId'
    left join property_log p3 on p1.event_id = p3.event_id and p3.log_key = 'messageTypeId'
    left join property_log p4 on p1.event_id = p4.event_id and p4.log_key = 'message'
    where p1.log_key = 'op' and p1.log_value = 'tracking'
);

あなたのデータでテストできますか?

以下のように、ペアのインデックスevent_id, log_keyが必要になる場合があります。

 create index event_key_idx on property_log(event_id, log_key);

SQL フィドルの例

于 2012-11-28T14:53:35.143 に答える