下記構成でm_sysテーブルのレコード数が多くなるにつれSELECT実行で 「500 Internal Server Error」が出るようになってしましました。対策ありましたらよろしくお願いいたします。
CREATE TABLE m_sys (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
mon_am1 smallint(1),
mon_am2 smallint(1),
中略
fri_am1 smallint(1),
fri_am2 smallint(1),
PRIMARY KEY (id)
);
INSERT INTO m_sys (mon_am1,mon_am2,tue_am1,tue_am2,wed_am1,wed_am2,thu_am1,thu_am2,fri_am1,fri_am2) VALUES('1','2','3','4','5','6','7','8','9','10');
CREATE TABLE m_schedule_a (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
schedule CHAR(6),
PRIMARY KEY (id)
);
INSERT INTO m_schedule_a (schedule) VALUES('1:00');
中略
INSERT INTO m_schedule_a (schedule) VALUES('10:00');
SELECT
msa1.schedule as mon_am1,
msa2.schedule as mon_am2,
中略
msa9.schedule as fri_am1,
msa10.schedule as fri_am2
from
m_sys m,
m_schedule_a msa1,
中略
m_schedule_a msa10
where
m.mon_am1 = msa1.id
AND
m.mon_am2 = msa2.id
AND
中略
AND
m.fri_am1 = msa9.id
AND
m.fri_am2 = msa10.id
総当りでぶつけてWHEREで絞り込む方法ではメモリも時間も大量に使ってしまう! 必要なものだけ搾り出すように変更する!!
例えば、スカラー副問い合わせを用いれば以下のような感じ!!
SELECT (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am1 OFFSET 0 LIMIT 1) mon_am1, (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am2 OFFSET 0 LIMIT 1) mon_am2, 中略 (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.fri_am2 OFFSET 0 LIMIT 1) fri_am2 FROM m_sys a
http://dev.mysql.com/doc/refman/4.1/ja/scalar-subqueries.html
まずはお願いなのですが、
お使いのOS、アプリケーションサーバ、RDBMSの名称とバージョンなど、
何も判らないと原因の特定は難しくなりますので、必須だとご記憶ください。
不適当な回答が集まっても混乱をきたしますから、私への返信欄か、
あるいは、コメント欄を開く設定に変更してコメント欄に、
書き加えておくことを勧めます。
一般論としては、AND式が長すぎるためのエラーと思われます。
その他、まったく正規化がなされていないので
テーブル設計から見直す必要があります。
総当りでぶつけてWHEREで絞り込む方法ではメモリも時間も大量に使ってしまう! 必要なものだけ搾り出すように変更する!!
例えば、スカラー副問い合わせを用いれば以下のような感じ!!
SELECT (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am1 OFFSET 0 LIMIT 1) mon_am1, (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am2 OFFSET 0 LIMIT 1) mon_am2, 中略 (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.fri_am2 OFFSET 0 LIMIT 1) fri_am2 FROM m_sys a
http://dev.mysql.com/doc/refman/4.1/ja/scalar-subqueries.html
コメント(0件)