使用一对多加入

时间:2017-05-22 10:03:27

标签: mysql search relationship

我的问题是一个慢速搜索查询,表之间有一对多的关系。我的桌子看起来像这样。

表格分配

CREATE TABLE `Assignment` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ProjectId` int(10) unsigned NOT NULL,
`AssignmentTypeId` smallint(5) unsigned NOT NULL,
`AssignmentNumber` varchar(30) NOT NULL,
`AssignmentNumberExternal` varchar(50) DEFAULT NULL,
`DateStart` datetime DEFAULT NULL,
`DateEnd` datetime DEFAULT NULL,
`DateDeadline` datetime DEFAULT NULL,
`DateCreated` datetime DEFAULT NULL,
`Deleted` datetime DEFAULT NULL,
`Lat` double DEFAULT NULL,
`Lon` double DEFAULT NULL,
PRIMARY KEY (`Id`),
KEY `idx_assignment_assignment_type_id` (`AssignmentTypeId`),
KEY `idx_assignment_assignment_number` (`AssignmentNumber`),
KEY `idx_assignment_assignment_number_external` 
(`AssignmentNumberExternal`)
) ENGINE=InnoDB AUTO_INCREMENT=5280 DEFAULT CHARSET=utf8;

表格ExtraFields

CREATE TABLE `ExtraFields` (
`assignment_id` int(10) unsigned NOT NULL,
`name` varchar(30) NOT NULL,
`value` text,
PRIMARY KEY (`assignment_id`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的搜索查询

SELECT 
`Assignment`.`Id`, COL_5_72, COL_5_73, COL_5_74, COL_5_75, COL_5_76, 
COL_5_77 FROM ( 
SELECT 
`Assignment`.`Id`, 
`Assignment`.`AssignmentNumber` AS COL_5_72,
`Assignment`.`AssignmentNumberExternal` AS COL_5_73 ,
`AssignmentType`.`Name` AS COL_5_74,
`Assignment`.`DateStart` AS COL_5_75,
`Assignment`.`DateEnd` AS COL_5_76,
`Assignment`.`DateDeadline` AS COL_5_77 FROM `Assignment`
CASE WHEN `ExtraField`.`Name` = "WorkDistrict" THEN 
`ExtraField`.`Value` end as COL_5_78 FROM `Assignment`
    LEFT JOIN `ExtraFields` as `ExtraField` on 
`ExtraField`.`assignment_id` = `Assignment`.`Id`            
WHERE `Assignment`.`Deleted` IS NULL -- Assignment should not be removed.
AND (1=1) -- Add assignment filters.
) AS q1 
GROUP BY `Assignment`.`Id` 
HAVING 1 = 1 
AND COL_5_78 LIKE '%Amsterdam East%'
ORDER BY COL_5_72 ASC, COL_5_73 ASC;

当表格只有大约3500条记录时,我的查询需要几秒钟的时间来执行并返回结果。

搜索相关数据的更好方法是什么?我应该只是在Assignment表中添加一个JSON字段并使用MySQL 5.7 Json查询功能吗?或者我在设计数据库时犯了错误?

1 个答案:

答案 0 :(得分:0)

您正在使用select from子查询,强制MySQL为每次执行创建未编制索引的临时表。删除子查询(你真的不需要它),它会更快。