3

我的查询速度有问题 - 目前它的运行时间约为 16 秒,我需要加快速度!

我的表方案如下:

用户:

  • id (int 10, 主键)
  • 用户名(varchar 100)
  • 密码(varchar 100)

用户元:

  • 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 和 ORDER BY 子句添加到查询中。

谢谢你的帮助。:)

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 回答