アプリ版:「スタンプのみでお礼する」機能のリリースについて

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件)

まずMySQL4って一番最悪のバージョンですが本当に大丈夫ですか?


とくにMySQL4.0とMySQL4.1は似たバージョンですが中身はほぼ別物で
もし4.0をつかっているなら高速化はかなり難しいと思います。

MySQL4使うくらいならMySQL3.23の方がチューニングしやすいと思います。
MySQL5以降の適当な運用を検討した方がよいと思いますが・・・

ちなみにSQL文的にもUNIONでつないだものを集計するのは相当無理があるように見えます
なぜ同じ様な構成のテーブルを冗長に分断してしまったのでしょうか?
構成がおなじならパーティショニングなどで統合して管理した方がよいのでは?

あとはexplainで様子を見ながらチューニングしていくのが賢明でしょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!