优化MySQL查询-在联接中选择子联接

时间:2019-09-03 19:39:09

标签: mysql sugarcrm

好的,所以SugarCRM中的查询很慢,当它背对背运行时会引起严重的问题……等等。我在下面粘贴了该查询,我想看看是否有任何可能知道更好的方法来构造此查询的专家都可以在几分之一秒的时间内运行该查询,而不是现在需要2秒钟以上的时间。

SELECT acl_actions.id, 
   acl_actions.NAME, 
   acl_actions.category, 
   acl_actions.acltype, 
   acl_actions.aclaccess, 
   tt.access_override 
FROM   acl_actions 
   LEFT JOIN (SELECT acl_roles_users.user_id, 
                     acl_roles_actions.action_id, 
                     acl_roles_actions.access_override 
              FROM   acl_roles_users 
                     LEFT JOIN acl_roles_actions acl_roles_actions 
                            ON acl_roles_actions.role_id = 
                               acl_roles_users.role_id 
                               AND acl_roles_actions.deleted = 0 
              WHERE  ( acl_roles_users.user_id = 
                       'XXXXXXXXX' ) 
                     AND ( acl_roles_users.deleted = 0 )) tt 
          ON tt.action_id = acl_actions.id 
WHERE  acl_actions.deleted = 0 
ORDER  BY acl_actions.category ASC, 
      acl_actions.NAME ASC; 

这是解释的结果

+----+-------------+-------------------+------------+------+---------------------------------------------------------------+-----------------------+---------+------------------------------------------+------+----------+--------------------------+
| id | select_type | table             | partitions | type | possible_keys                                                 | key                   | key_len | ref                                      | rows | filtered | Extra                    |
+----+-------------+-------------------+------------+------+---------------------------------------------------------------+-----------------------+---------+------------------------------------------+------+----------+--------------------------+
|  1 | SIMPLE      | acl_actions       | NULL       | ref  | idx_del_category_name_acltype_aclaccess,idx_del_category_name | idx_del_category_name | 2       | const                                    | 3520 |   100.00 | Using index condition    |
|  1 | SIMPLE      | acl_roles_users   | NULL       | ref  | idx_acluser_id                                                | idx_acluser_id        | 145     | const                                    |    1 |   100.00 | Using where              |
|  1 | SIMPLE      | acl_roles_actions | NULL       | ref  | idx_acl_role_id,idx_del_override,idx_aclrole_action           | idx_del_override      | 147     | production.acl_roles_users.role_id,const |  312 |   100.00 | Using where; Using index |
+----+-------------+-------------------+------------+------+---------------------------------------------------------------+-----------------------+---------+------------------------------------------+------+----------+--------------------------+

创建表格

CREATE TABLE `acl_actions` (
  `id` char(36) NOT NULL,
  `date_entered` datetime DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  `modified_user_id` char(36) DEFAULT NULL,
  `created_by` char(36) DEFAULT NULL,
  `name` varchar(150) DEFAULT NULL,
  `category` varchar(100) DEFAULT NULL,
  `acltype` varchar(100) DEFAULT NULL,
  `aclaccess` int(3) DEFAULT NULL,
  `deleted` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_aclaction_id_del` (`id`,`deleted`),
  KEY `idx_category_name` (`category`,`name`),
  KEY `idx_del_category_name_acltype_aclaccess` (`deleted`,`category`,`name`,`acltype`,`aclaccess`),
  KEY `idx_del_category_name` (`deleted`,`category`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 
CREATE TABLE `acl_roles_users` (
  `id` char(36) NOT NULL,
  `role_id` char(36) DEFAULT NULL,
  `user_id` char(36) DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  `deleted` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_aclrole_id` (`role_id`),
  KEY `idx_acluser_id` (`user_id`),
  KEY `idx_aclrole_user` (`role_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
CREATE TABLE `acl_roles_actions` (
  `id` char(36) NOT NULL,
  `role_id` char(36) DEFAULT NULL,
  `action_id` char(36) DEFAULT NULL,
  `access_override` int(3) DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  `deleted` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `idx_acl_role_id` (`role_id`),
  KEY `idx_acl_action_id` (`action_id`),
  KEY `idx_del_override` (`role_id`,`deleted`,`action_id`,`access_override`),
  KEY `idx_aclrole_action` (`role_id`,`action_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

0 个答案:

没有答案