
SQLの処理速度があまりに遅い(最悪1分以上かかる)ので
わかる方がいらっしゃいましたらアドバイスをお願いいたします
MySQL4になります-----------------------
-- 問題SQL
SELECT COUNT(*) as count FROM
(
SELECT id, word FROM
(
SELECT distinct tbl.id, p.word
FROM table01 tbl INNER JOIN table02 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
UNION
SELECT distinct tbl.id, p.word
FROM table11 tbl INNER JOIN table12 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
) test1
UNION
SELECT id, word FROM
(
SELECT distinct tbl.id, p.word
FROM table21 tbl INNER JOIN table22 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
UNION
SELECT distinct tbl.id, p.word
FROM table31 tbl INNER JOIN table32 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
UNION
SELECT distinct tbl.id, p.word
FROM table41 tbl INNER JOIN table42 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
UNION
SELECT distinct tbl.id, p.word
FROM table51 tbl INNER JOIN table52 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
) test2 GROUP BY word
) A
----------------------
既存のテーブルが、table01~table51(各テーブルに付随するサブテーブルでtable02~table52がある感じ)まであり
その各テーブル内に存在しているカラムkeyword(varcharで NOT NULL、indexは張ってある)の一文字だけを指定し検索結果の件数を取得したいのですが
速度があまりに遅く、悩んでおります。
2文字以上だと若干重いかなという感じがするだけです
(実際のSQLはもっとごちゃごちゃしており、見やすくするため不必要なカラム等削除しております)
table01は51万レコード、table11は、175万レコードあります。
(その他は1万レコード程度です)
そもそもこの件数をLIKE検索で行っていること自体、おかしいのですが
もうどうしようもないので、このSQLをなんとか修正したいと考えております
目標としては、
この旧SQLと新SQLで取得した件数が同じになり、かつ速度が上がることにあります
「 ) test2 group by word 」については、table21~table51で重複するwordを削除したいという意向があり、ついております
(table01とtable11と一緒にunionして、group byしたくないです)
私のほうで修正・実行した方法は、
1)SELECT count(*) as count from を SELECT count(id) as count from と*を止める指定する
2)test1とtest2内のSELECTで取得するカラムを最小限にする(上記のものはかなり少なくしてあり、もうこれ以上減らせません…)
3)test1内のSQLでtable01、table11をunionしているところを、分割する
↓こんな感じに分割
SELECT count(id) as count from
(
select id, word from
(
SELECT distinct tbl.id, p.word
FROM table01 tbl INNER JOIN table02 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
) test1
union
select id, word from
(
SELECT distinct tbl.id, p.word
FROM table11 tbl INNER JOIN table12 p ON p.id = tbl.id WHERE keyword LIKE 'a%'
) test2
union
select id, word from
(
・
・
・
となります。
一応、60秒程度掛かっていたものが、5~20秒程度で帰ってくるようにはなりましたが
まだまだ実用には耐えられない状況です
もしまだ改善すべき箇所等ございましたらアドバイスをおねがいいたします
よろしくお願いいたします
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
まずMySQL4って一番最悪のバージョンですが本当に大丈夫ですか?
とくにMySQL4.0とMySQL4.1は似たバージョンですが中身はほぼ別物で
もし4.0をつかっているなら高速化はかなり難しいと思います。
MySQL4使うくらいならMySQL3.23の方がチューニングしやすいと思います。
MySQL5以降の適当な運用を検討した方がよいと思いますが・・・
ちなみにSQL文的にもUNIONでつないだものを集計するのは相当無理があるように見えます
なぜ同じ様な構成のテーブルを冗長に分断してしまったのでしょうか?
構成がおなじならパーティショニングなどで統合して管理した方がよいのでは?
あとはexplainで様子を見ながらチューニングしていくのが賢明でしょう
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
SQL Left Join で重複を排除す...
-
クエリ表示と、ADOで抽出したレ...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
グラビアアイドルからAV女優に...
-
エラー 1068 (42000): 複数の主...
-
sqlで、600行あるテーブルを100...
-
SQLサーバから、項目の属性(型...
-
NOT INをNOT EXISTSで書き直したい
-
PL/SQLの変数について
-
select文のwhere句に配列を入れ...
-
LEFT JOIN と GROUP BY
-
WordpressのContact form 7でzi...
-
inner joinをすると数がおかし...
-
MySQL NULLだけをカウントして...
-
副問合せの書き方について
-
前のidをコピーするSQL文
-
[MySQL] UNIQUE制約の値を更新...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
PL/SQLの変数について
-
WordpressのContact form 7でzi...
-
複数テーブルのGROUP BY の使い...
-
バインド変数について
-
inner joinをすると数がおかし...
-
MySQLのint型で001と表示する方...
-
updateを1行ずつ実行したい。
おすすめ情報