3

クエリの速度に問題があります。現在、クエリは約16秒で実行されているため、速度を上げる必要があります。

私のテーブルスキームは次のとおりです。

ユーザー:

  • id(int 10、主キー)
  • ユーザー名(varchar 100)
  • パスワード(varchar 100)

Users_meta:

  • id(int 10、主キー)
  • ユーザー(int 10)
  • メタ(varchar 100)
  • 値(ロングテキスト)

ユーザーメタテーブルのさまざまな行(名、姓など)のデータを列として返す必要があります。このクエリは機能しますが、実行が遅すぎます。

SELECT
Users.id as id,
Users.username as username,
firstName.value as metaFirstName,
lastName.value as metaLastName,
userLevel.value as metaUsername,
employer.value as metaEmployer,
gto.value as metaGTO
FROM Users
LEFT JOIN (Users_meta as firstName) ON (firstName.user = Users.id AND firstName.meta = 'first_name')
LEFT JOIN (Users_meta as lastName) ON (lastName.user = Users.id AND lastName.meta = 'last_name')
LEFT JOIN (Users_meta as userLevel) ON (userLevel.user = Users.id AND userLevel.meta = 'user_level')
LEFT JOIN (Users_meta as employer) ON (employer.user = Users.id AND employer.meta = 'employer')
LEFT JOIN (Users_meta as gto) ON (gto.user = Users.id AND gto.meta = 'gto')

また、WHERE句とORDERBY句をクエリに追加できる必要があります。

ご協力いただきありがとうございます。:)

4

2 に答える 2

2

これが速いかどうかはわかりません。しかし、多分このようなもの:

SELECT
    Users.id as id,
    Users.username as username,
    MAX(CASE WHEN Users_meta.meta = 'first_name' THEN Users_meta.value ELSE NULL END) AS metaFirstName,
    MAX(CASE WHEN Users_meta.meta = 'last_name' THEN Users_meta.value ELSE NULL END) AS metaLastName,
    MAX(CASE WHEN Users_meta.meta = 'user_level' THEN Users_meta.value ELSE NULL END) AS metaUsername,
    MAX(CASE WHEN Users_meta.meta = 'employer' THEN Users_meta.value ELSE NULL END) AS metaEmployer,
    MAX(CASE WHEN Users_meta.meta = 'gto' THEN Users_meta.value ELSE NULL END) AS metaGTO
FROM
    Users
    LEFT JOIN Users_meta
        ON Users_meta.user = Users.id
GROUP BY
    Users.ID,
    Users.username
于 2012-05-03T11:17:49.857 に答える
1

まず、テーブル meta: に複合インデックスを追加します(meta, user, value)。または(user, meta, value)WHEREクエリに追加の条件がある場合、これらは確かに役立ちます。

クエリはテーブル内の (ほぼ) すべてのデータを使用する必要がUsers_metaあるため、これらのインデックスは使用されない可能性があります。

longtextデータ型は別の問題です。本当に広い列が必要ですか?

于 2012-05-03T12:43:05.930 に答える