1

次のクエリは2つのテーブルで動作します:dev_Profiledev_User

SELECT
  dev_Profile.ID AS pid,
  Name AS username,
  st1.online
FROM
  dev_Profile
  LEFT JOIN (
    SELECT 
      dev_User.ID, 
      lastActivityTime /* DATETIME */
    FROM
      dev_User)
    AS st1 ON st1.ID = dev_Profile.UserID;

各テーブルには約11K行があり、このクエリは完了するのに6秒近くかかります。私はまだデータベースの経験があまりありません。すでにインデックス(PK)があり、インデックスがないため、のインデックスを作成することでうまくいくと思いましたdev_Profile.UserIDが、これはまったく役に立ちませんでした。dev_Profile.IDdev_Profile.UserID

編集:このクエリのEXPLAIN出力:

+----+-------------+-------------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+-------+-------+
|  1 | PRIMARY     | dev_Profile | ALL  | NULL          | NULL | NULL    | NULL | 11521 |       |
|  1 | PRIMARY     | <derived2>  | ALL  | NULL          | NULL | NULL    | NULL | 11191 |       |
|  2 | DERIVED     | dev_User    | ALL  | NULL          | NULL | NULL    | NULL | 11440 |       |
+----+-------------+-------------+------+---------------+------+---------+------+-------+-------+

助言がありますか?

4

1 に答える 1

7

なぜネストされた選択?それはオプティマイザを混乱させるかもしれません。それを排除してみてください:

SELECT
  dev_Profile.ID AS pid,
  Name AS username,
  st1.online
FROM
  dev_Profile
  LEFT JOIN dev_User st1 ON st1.ID = dev_Profile.UserID;
于 2012-08-18T01:34:06.430 に答える