慢MySQL使用中小型数据库离开了连接查询

时间:2012-03-02 23:54:17

标签: mysql performance left-join

我有两张基本表:

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 |
+----------+

对于users表中的此示例,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用户,所以它不应该花费几秒钟的时间&#39;处理,特别是当我可以查询数据库标准并获得通常的<0.01秒响应时。

有什么我公然做错了,还是有更好的方法来优化查询?这个将在(并且正在使用)上使用的一般页面有一个LIMIT $ X,20,通过HAVING进行各种搜索,但是主要的查询很慢,让我担心。

1 个答案:

答案 0 :(得分:0)

您的查询很奇怪。

它可以优化它,但我可以提供其他查询来获得相同的结果。

   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

Aloso你必须检查用户(id)上的索引是否存在 - probalby它存在。

相关问题