我有两张基本表:
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进行各种搜索,但是主要的查询很慢,让我担心。
答案 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它存在。