2012-03-02 12 views
1

でクエリを結合左: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を使用して行われるさまざまな検索が行われますが、主なクエリは私の心配を遅らせます。

+0

'users.idとdept.client_id'のインデックスを作成しましたか?インデックスを作成しなくても、それは遅いようです。 – theking963

+0

'client_dept'テーブルに' client_id'の 'INDEX'を追加しようとしましたか? – jmoerdyk

+0

これは答えではありません。コメント –

答えて

0

あなたの質問はちょっと変です。

私はそれを最適化できますが、私は同じ結果を得るために他のクエリを提供することができます。あなたがユーザー(ID)にそのインデックスをチェックする必要がAloso

select u.username,c.c 

    from 
    (select count(*) as c,client_id from client_dept group by client_id) as c 
    left join 
     users as u 
     on u.id=c.client_id; 

は高速化のためには存在しmy.conf

sort_buffer_size = 64M 
join_buffer_size = 64M 

でこの変数を増やすことができます - probalbyが存在します。

関連する問題