我的数据库中有一个查询需要 25 秒才能返回结果,这太长了。看起来应该是很简单的。两张桌子;主表(文档)是一个带有一些数据列的标准表,连接表是一个只有两列(parent_id,division_id)的映射表。以前映射表上没有索引,所以我添加了一个索引,并更改了“解释”以包含索引,但似乎对性能没有影响。
查询如下所示:
explain SELECT DISTINCT doc.* FROM document doc LEFT JOIN multi_division_mapper divisions ON doc.id = divisions.parent_id WHERE doc.clientId = 'SOME_GUID' AND (divisions.division_id IS NULL OR divisions.division_id IN ('SOME_GUID'));
解释的结果是:
文档中的总行数:6720 映射器中的总行数:6173
根据我收集到的信息,我需要改进“类型”或“额外”以使查询更快。我在这里能做什么?
创建表语句:
CREATE TABLE `document` ( `id` varchar(36) NOT NULL, `addedBy` varchar(255) DEFAULT NULL, `addedDate` datetime NOT NULL, `editedBy` varchar(255) DEFAULT NULL, `editedDate` datetime NOT NULL, `deleted` bit(1) DEFAULT NULL, `clientId` varchar(36) NOT NULL, `departmentId` varchar(36) DEFAULT NULL, `documentParentId` varchar(36) DEFAULT NULL, `documentParent` varchar(50) DEFAULT NULL, `fileId` varchar(255) DEFAULT NULL, `fileUrl` varchar(600) DEFAULT NULL, `documentName` varchar(500) NOT NULL, `displayName` varchar(255) NOT NULL, `documentId` varchar(45) DEFAULT NULL, `notes` varchar(1000) DEFAULT NULL, `visibility` varchar(45) NOT NULL DEFAULT 'PRIVATE', `documentType` varchar(45) NOT NULL, `restrictDelete` bit(1) NOT NULL, `customData` text, `releaseDate` datetime NOT NULL, `expirationDate` datetime NOT NULL, `isApproved` bit(1) NOT NULL DEFAULT b'0', `userSupplier` varchar(36) DEFAULT NULL, `complianceCertificateId` varchar(36) DEFAULT NULL, `Status` varchar(50) DEFAULT 'NEUTRAL', PRIMARY KEY (`id`), KEY `idx_client` (`clientId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `multi_division_mapper` ( `parent_id` varchar(36) NOT NULL, `division_id` varchar(36) NOT NULL, PRIMARY KEY (`parent_id`,`division_id`), KEY `idx_parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
通过创建以下索引,我能够在测试中获得更有利的 EXPLAIN 报告:
我还删除了
idx_parent
因为它是多余的;它是主键的前缀。