でクエリを結合左:usersテーブルにこの例ではスローMySQLは私は2つの基本的なテーブル持っている小中規模のデータベース
CREATE TABLE IF NOT EXISTS `users` (
`id` INT(32) NOT NULL auto_increment UNIQUE,
`profile_type` INT(3),
`date_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`last_login` DATETIME DEFAULT 0,
`username` VARCHAR(255) NOT NULL,
`password` VARCHAR(32) NOT NULL,
PRIMARY KEY(`id`, `profile_type`)
);
+----------+
| count(*) |
+----------+
| 6455 |
+----------+
CREATE TABLE IF NOT EXISTS `client_dept` (
`id` INT(32) NOT NULL auto_increment,
`date_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`client_id` INT(32) NOT NULL,
PRIMARY KEY (`id`, `client_id`)
);
+----------+
| count(*) |
+----------+
| 9729 |
+----------+
を、profile_type & 32は、クライアントプロファイルで設定されたすべてのユーザーを選択します。
完全な検索とリストを実行しているときに、ユーザーデータベースのクエリをスピードアップしようとしています。現在、クライアントのユーザー名の一覧と、そのユーザーに割り当てられている部署の数(ID)を取得しようとしています。
ここで私が試したクエリがあり、その処理時間:セットで
SELECT users.username
FROM users
LEFT JOIN client_dept ON users.id = client_dept.client_id
WHERE users.profile_type & 32
GROUP BY users.id;
6020行(9.85秒)セットで
SELECT users.username
FROM users
LEFT JOIN (
SELECT client_id, id
FROM client_dept
GROUP BY client_id
) AS dept ON users.id = dept.client_id;
6020行(2.27秒)
SELECT user.username
FROM (
SELECT username, id
FROM users WHERE profile_type & 32
) AS user
LEFT JOIN (
SELECT client_id, id
FROM client_dept
GROUP BY client_id) AS dept ON user.id = dept.client_id;
6020行セット(2.21秒)
私は他のリソースを見てきましたが、サブクエリがSQLの処理速度を低下させると思われるようですが、この場合はスピードアップしています。しかし、私は人の10kユーザーしか持っていないので、特にデータベース標準を照会して、通常の< 0.01秒の応答を取得する際に、処理に「秒」を要すべきではありません。
私は間違ってやっていることがあるのですか、それともクエリを最適化する方法がありますか?これに使用される一般的なページは、LIMIT $ X、20、HAVINGを使用して行われるさまざまな検索が行われますが、主なクエリは私の心配を遅らせます。
'users.idとdept.client_id'のインデックスを作成しましたか?インデックスを作成しなくても、それは遅いようです。 – theking963
'client_dept'テーブルに' client_id'の 'INDEX'を追加しようとしましたか? – jmoerdyk
これは答えではありません。コメント –