2017-05-22 9 views
-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クエリ機能を使用するだけですか?または、私は自分のデータベースを設計するのに間違いを犯しましたか?

+0

'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/ –

+0

ExtraFieldsテーブルのprimary_keyのみを作成しますassign_idで構成されます。または、assigment_idだけで余分なインデックスを作成すると、クエリが高速化する可能性があります。 – Sourcery

+0

また、ネストされた選択が列の名前だけを変更するように見えますか? – Sourcery

答えて

0

各実行のインデックスなしテンポラリテーブルを強制的に作成するselect from subqueryを使用しています。サブクエリを削除してください(本当にここでは必要ありません)、はるかに高速になります。

関連する問題