我有几个查询可以达到他们的目的,但由于我不是专家,只是涉猎到那里,我想知道这些查询是否可以优化。
我问,因为似乎随着更多记录的添加,查询完成所需的时间似乎也会增加。
SELECT u.`UserId`, u.`GroupId`, u.`MemberType`, g.`GroupLevel`, g.`U`, g.`D`,
(SELECT COUNT(u2.`UserId`) FROM `users` u2
INNER JOIN `groups` g2 ON g2.`Active` = 1 AND u2.`UserId` = g2.`UserId`
WHERE u2.`Level` = '$L_MEMBER'
AND u2.`MemberType` = '$M_Type'
AND u2.`CounUserId` = u.`UserId`
AND u2.`Active` = 1
AND g2.`U` > g.`U`
AND g2.`D` < g.`D`) as UsersGroup
FROM `users` u
INNER JOIN `groups` g ON g.`UserId` = u.`UserId` AND g.`Active`
WHERE u.`Level` = '$L_MEMBER' AND u.`DateCreated` < '$subdate' AND u.`Active` = 1
ORDER BY u.`UserId`
SELECT g.`UserId` FROM `groups` g
WHERE g.`U` BETWEEN '$U' AND '$D'
AND g.`UserId` !=0
AND g.`UserId` NOT IN (SELECT da.`TaggedUserId` as UserId FROM `dateawarded` da WHERE da.`UserId` = '$userid' AND `DateTagged` != '$datetagged')
AND g.`UserId` NOT IN (SELECT u.`UserId` FROM `users` u WHERE u.`Membership` <= '1')
AND g.`UserId` NOT IN (SELECT d.`DemotedUserId` FROM `demoted` d WHERE d.`UserId` = '$userid' AND d.`DateDemoted` < '$datetagged 00:00:00')
AND g.`DateModified` < '$thedate'
EXPLAIN结果:
查询1:
1 PRIMARY g ALL NULL NULL NULL NULL 18747 Using where; Using temporary; Using filesort
1 PRIMARY u eq_ref PRIMARY PRIMARY 4 user_db.g.UserId 1 Using where
2 DEPENDENT SUBQUERY g2 ALL NULL NULL NULL NULL 18747 Using where
2 DEPENDENT SUBQUERY u2 eq_ref PRIMARY PRIMARY 4 user_db.g2.UserId 1 Using where
查询2:
1 PRIMARY g ALL NULL NULL NULL NULL 18747 Using where
4 SUBQUERY d ALL NULL NULL NULL NULL 6895 Using where
3 SUBQUERY u ALL PRIMARY NULL NULL NULL 9354 Using where
2 SUBQUERY da ALL NULL NULL NULL NULL 39260 Using where
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:0)
您是否对这些查询进行了分析,看看它们运行了多长时间?
然后添加更多(虚拟测试)数据&amp;看看他们花多长时间了判断这是否可以接受?
有关详细信息,请参阅https://dev.mysql.com/doc/refman/5.5/en/show-profile.html。
你会得到像这样的输出
的MySQL&GT;显示简介;
+ ---------------------- + ---------- +
|状态|持续时间|
+ ---------------------- + ---------- +
|检查权限| 0.000040 |
|创建表| 0.000056 |
|创建后| 0.011363 |
|查询结束| 0.000375 | |释放物品| 0.000089 |
|记录慢查询| 0.000019 |
|清理| 0.000005 |
+ ---------------------- + ---------- +
7行(0.00秒)
只有您可以决定查询运行的可接受时间。
[Udpdate]我只发了一个答案,因为这个评论太大了。 @Raymond说EXPLAIN [query]
非常有帮助
答案 1 :(得分:0)
要优化第一个查询,请添加以下索引:
ALTER TABLE `groups` ADD INDEX `groups_idx_userid_grouple_u_d` (`UserId`, `GroupLevel`, `U`, `D`);
ALTER TABLE `groups` ADD INDEX `groups_idx_active_userid_u` (`Active`, `UserId`, `U`);
ALTER TABLE `users` ADD INDEX `users_idx_level_activ_useri_datec_group_membe` ( `Level`, `Active`, `UserId`, `DateCreated`, `GroupId`, `MemberType` );
ALTER TABLE `users` ADD INDEX `users_idx_level_member_active_userid_counus` ( `Level`, `MemberType`, `Active`, `UserId`, `CounUserId` );
要优化第二个查询,请添加以下索引:
ALTER TABLE `dateawarded` ADD INDEX `dateawarded_idx_userid_datetagged_taggeduser` (`UserId`, `DateTagged`, `TaggedUserId`);
ALTER TABLE `demoted` ADD INDEX `demoted_idx_userid_datedemote_demoteduse` (`UserId`, `DateDemoted`, `DemotedUserId`);
ALTER TABLE `groups` ADD INDEX `groups_idx_u_userid` (`U`, `UserId`);
ALTER TABLE `users` ADD INDEX `users_idx_membership_userid` (`Membership`, `UserId`);