MySQL ステートメントの 1 つに問題があります。
基本的に、次のステートメントの実行には 5 秒かかります。2 つの select ステートメントの結合が原因であると診断されました。select ステートメントを個別に実行すると 0.2 秒しかかかりませんが、JOIN と組み合わせると 5 秒かかります。
私たちのやり方が間違っていること、またはより良い方法を見つけられることはありますか?
結合に含まれるすべての列にインデックスが追加されましたが、速度には影響しません
SELECT temp_4.primaryid, temp_1.`subjectID` , temp_4.`testOccasionID`
,`studyNumbers` ,`testDate`
FROM (
SELECT * FROM (
SELECT primarys.primaryid , q_1 AS `subjectID` , q_2 AS `studyNumbers` FROM
primarys LEFT OUTER JOIN questions_1_100 ON primarys.primaryid =
questions_1_100.primaryid WHERE 0 = 0 AND q_1 IS NOT NULL GROUP BY primaryid) AS
maintable_1
GROUP BY `subjectID` ) AS temp_1
JOIN
(SELECT * FROM
(SELECT primarys.primaryid , q_1 AS `subjectID` , q_4 AS `testOccasionID` ,
DATE_FORMAT(q_5, '%m/%d/%Y') AS `testDate` FROM primarys LEFT OUTER JOIN
questions_1_100 ON primarys.primaryid = questions_1_100.primaryid WHERE 0 = 0 AND
q_1 IS NOT NULL AND q_4 IS NOT NULL GROUP BY primaryid) AS maintable_4
GROUP BY `subjectID` ,`testOccasionID` ) AS temp_4
ON temp_1.`subjectID` = temp_4.`subjectID`
テーブル定義:
CREATE TABLE primarys
( primaryid BIGINT(20) NOT NULL AUTO_INCREMENT,
dateinserted DATETIME,
datemodified DATETIME,
useridinserted BIGINT(20),
useridmodified BIGINT(20),
locked VARCHAR(1) NOT NULL DEFAULT 0,
primaryquestionlinks TEXT,
PRIMARY KEY (primaryid),
FOREIGN KEY (useridinserted) REFERENCES users (userid) ON UPDATE CASCADE ON DELETE SET NULL,
FOREIGN KEY (useridmodified) REFERENCES users (userid) ON UPDATE CASCADE ON DELETE SET NULL ) ENGINE=InnoDB;
CREATE TABLE questions_1_100
( primaryid BIGINT(20) NOT NULL,
q_1 BIGINT(20),
q_2 VARCHAR(50),
q_3 BIGINT(20),
q_4 BIGINT(20),
q_5 DATE,
PRIMARY KEY (primaryid),
FOREIGN KEY (primaryid) REFERENCES primarys (primaryid) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB;
1 つの行進主体のデータは次のとおりです。順序は primaryid、q_1、q_2、q_4、q_5 です。
1 1 01001 NULL NULL
7286 1 NULL 1 1997-12-18
7287 1 NULL 2 1998-02-25
必要な出力は次のとおりです。
7286 1 01001 1 1997-12-18
7287 1 01001 2 1998-02-25
どうもありがとう
これをさらに一歩進めます... q_1 と q_4 が 2 つの別々のテーブルにある場合はどうでしょうか。次のテーブル構造など。私が考えることができる唯一の方法は、左外部結合といくつかのサブクエリを追加することですか?
CREATE TABLE primarys
( primaryid BIGINT(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (primaryid));
CREATE TABLE questions_1_100
( primaryid BIGINT(20) NOT NULL,
q_1 BIGINT(20),
q_2 VARCHAR(50),
PRIMARY KEY (primaryid));
CREATE TABLE questions_101_200
( primaryid BIGINT(20) NOT NULL,
q_4 BIGINT(20),
q_5 DATE,
PRIMARY KEY (primaryid));
INSERT INTO primarys values (1);
INSERT INTO primarys values (7286);
INSERT INTO primarys values (7287);
INSERT INTO questions_1_100 VALUES (1,'1','01001');
INSERT INTO questions_1_100 VALUES (7286,'1','');
INSERT INTO questions_1_100 VALUES (7287,'1','');
INSERT INTO questions_101_200 VALUES (7286,'1','1997-12-18');
INSERT INTO questions_101_200 VALUES (7287,'2','1998-02-25');