MySQL查询需要优化吗?

时间:2018-03-14 14:57:36

标签: mysql

我有几个查询可以达到他们的目的,但由于我不是专家,只是涉猎到那里,我想知道这些查询是否可以优化。

我问,因为似乎随着更多记录的添加,查询完成所需的时间似乎也会增加。

  1. 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`
    
  2. 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'
    
  3. 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
    

    任何帮助都将不胜感激。

    谢谢!

2 个答案:

答案 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`);