【发布时间】:2013-04-04 20:31:12
【问题描述】:
我们将 SugarCRM 与 MySQL 5.5 数据库一起使用,并且发现频繁出现的查询性能不佳。
很遗憾,由于 SugarCRM 的性质,无法重新排序查询。我已经尝试通过索引进行优化,但还没有走得很远。也就是说,我也不是很擅长这样做。
您能否建议任何替代索引来改善我们的结果并避免文件排序?
查询:
SELECT DISTINCT cases.id, cases.case_number, cases.status, cases.name,
cases.date_entered,
cases.assigned_user_id, cases.system_id
FROM cases
INNER JOIN team_sets_teams tst ON tst.team_set_id = cases.team_set_id
INNER JOIN team_memberships team_memberships ON tst.team_id = team_memberships.team_id
AND team_memberships.user_id = 'f09ab586-986c-a6f6-0c2e-4d1f1432b6ec'
AND team_memberships.deleted=0
ORDER BY cases.case_number DESC
LIMIT 0,11;
解释结果:
select_type table type possible_keys key ref rows Extra
SIMPLE team_memberships ref team_id,user_id,idx_team_membership idx_team_membership const 26 Using where; Using index; Using temporary; Using filesort
SIMPLE tst ref idx_ud_set_id,idx_ud_team_id,idx_ud_team_set_id idx_ud_team_id sugarcrm.team_memberships.team_id 7 Using where
SIMPLE cases ref idx_cases_tmst_id,idx_cases_created idx_cases_tmst_id sugarcrm.tst.team_set_id 5 Using where
表定义:
CREATE TABLE `cases` (
`id` char(36) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`date_entered` datetime DEFAULT NULL,
`date_modified` datetime DEFAULT NULL,
`modified_user_id` char(36) DEFAULT NULL,
`created_by` char(36) DEFAULT NULL,
`description` text,
`deleted` tinyint(1) DEFAULT '0',
`assigned_user_id` char(36) DEFAULT NULL,
`team_id` char(36) DEFAULT NULL,
`case_number` int(11) NOT NULL AUTO_INCREMENT,
`type` varchar(255) DEFAULT NULL,
`status` varchar(100) DEFAULT NULL,
`priority` varchar(100) DEFAULT NULL,
`resolution` text,
`system_id` int(11) DEFAULT NULL,
`work_log` text,
`account_id` char(36) DEFAULT NULL,
`portal_viewable` tinyint(1) DEFAULT '0',
`team_set_id` char(36) DEFAULT NULL,
`parent_id` char(36) DEFAULT NULL,
`parent_type` varchar(255) DEFAULT 'Cases',
PRIMARY KEY (`id`),
UNIQUE KEY `casesnumk` (`case_number`),
UNIQUE KEY `case_number` (`case_number`,`system_id`),
KEY `idx_case_name` (`name`),
KEY `idx_account_id` (`account_id`),
KEY `idx_cases_stat_del` (`assigned_user_id`,`status`,`deleted`),
KEY `idx_cases_tmst_id` (`team_set_id`),
KEY `date_modified` (`date_modified`),
KEY `modified_user_id` (`modified_user_id`),
KEY `idx_cases_created` (`team_set_id`,`date_entered`),
KEY `team_id` (`team_id`),
KEY `idx_cases_del` (`deleted`),
KEY `idx_cases_date_entered` (`date_entered`),
KEY `idx_cases_status` (`status`),
KEY `idx_cases_parent_id` (`parent_id`),
KEY `idx_cases_priority` (`priority`)
) ENGINE=InnoDB
CREATE TABLE `team_sets_teams` (
`id` char(36) NOT NULL,
`team_set_id` char(36) DEFAULT NULL,
`team_id` char(36) DEFAULT NULL,
`date_modified` datetime DEFAULT NULL,
`deleted` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_ud_set_id` (`team_set_id`,`team_id`),
KEY `idx_ud_team_id` (`team_id`),
KEY `idx_ud_team_set_id` (`team_set_id`),
KEY `idx_tst_deleted` (`deleted`)
) ENGINE=InnoDB
CREATE TABLE `team_memberships` (
`id` char(36) NOT NULL,
`team_id` char(36) DEFAULT NULL,
`user_id` char(36) DEFAULT NULL,
`explicit_assign` tinyint(1) DEFAULT '0',
`implicit_assign` tinyint(1) DEFAULT '0',
`date_modified` datetime DEFAULT NULL,
`deleted` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `date_modified` (`date_modified`),
KEY `team_id` (`team_id`),
KEY `user_id` (`user_id`),
KEY `idx_team_membership` (`user_id`,`team_id`,`deleted`)
) ENGINE=InnoDB
【问题讨论】:
-
所有 ID 都是
CHAR(36)s 的事实绝对没有帮助,特别是因为表使用的是InnoDB,但您可能无法更改它。可能可以添加一些索引来帮助这个特定的查询,但它们可能不会产生很大的不同。慢有多慢? -
您说得对,我们无法改变这一点。通常,在具有大量 CPU 和 RAM 的服务器上查询需要 5 秒。但它经常被许多用户作为 dashlet 的一部分运行,并且应该能够在
-
你确定文件排序是 MySQL 花费最多时间的地方吗?您可以分析查询并使用这些结果更新您的问题吗?如果文件排序真的是瓶颈所在,我会感到惊讶。也就是说,SugarCRM 绝对不是为了高效而设计的。
-
这很有启发性。现在我必须弄清楚下一步该做什么。
starting 0.000015 ... Creating tmp table 0.000029 executing 0.000003 Copying to tmp table 0.891442 converting HEAP to MyISAM 0.498635 Copying to tmp table on disk 8.596956 Sorting result 0.287117 logging slow query 0.000002 logging slow query 0.000073 cleaning up 0.000006 -
查询速度变慢的是这个“ORDER BY cases.case_number DESC”。因此,您可以在 listviewdefs.php 的顶部添加检查是否有来自搜索表单的条件的功能。如果是这样,那么忽略它会很快,如果不是,添加 $_REQUEST['order_by'] = 'DO_NO_SORT'; .我希望这会为您解决问题。这是 SugarCRM 的一款非常糟糕的产品,不适合大数据。