-1
私の問題は、テーブル間に1対多の関係を持つ遅い検索クエリです。私のテーブルはこのように見えます。1対多の結合でスロー検索クエリ
テーブル割当
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;
マイ検索クエリテーブルが唯一の3500の周りにある
が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;
私のクエリを記録したが、実行するために数秒を要し、結果を返します。
関連するデータを検索するにはどうすればよいでしょうか?代入テーブルにJSONフィールドを追加し、MySQL 5.7 Jsonクエリ機能を使用するだけですか?または、私は自分のデータベースを設計するのに間違いを犯しましたか?
'Assignment'.'Id'、 ' COL_5_72 AS Assignment'.'AssignmentNumber'、COL_5_73 AS 'Assignment'.'AssignmentNumberExternal'、COL_5_74 AS ' AssignmentType'.'Name'、 'Assignment'を選択.DateStart' AS COL_5_75、 'Assignment'.'DateEnd' AS COL_5_76、 ' Assignment'.DateDeadline' AS COL_5_77 FROM 'Assignment' ..... GROUP BY BY' Assignment'.Id'は悪いSQLです。間違った結果が生じる可能性があります。https://www.psce.com/blog/2012/05/15/mysql-mistakes-do-you-use-group-by-correctly/ –
ExtraFieldsテーブルのprimary_keyのみを作成しますassign_idで構成されます。または、assigment_idだけで余分なインデックスを作成すると、クエリが高速化する可能性があります。 – Sourcery
また、ネストされた選択が列の名前だけを変更するように見えますか? – Sourcery