
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で質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
エラー 1068 (42000): 複数の主...
-
selectした大量データをinsert...
-
select文のwhere句に配列を入れ...
-
期間の重複を調べるSQL文につい...
-
バインド変数について
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
[MySQL] 3つのテーブルの結合で...
-
WordpressのContact form 7でzi...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
最小値をUPDATE
-
上位3位を求めるSQL文は?
-
ローカルルーターモードとは
-
updateを1行ずつ実行したい。
-
Postgreのupdateコマンドでエラー
-
ある条件の最大値+1を初番する...
-
少し前に放送されていたオムツ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
WordpressのContact form 7でzi...
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
クエリ表示と、ADOで抽出したレ...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
SQL Left Join で重複を排除す...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] UNIQUE制約の値を更新...
-
inner joinをすると数がおかし...
-
1テーブル&複数レコードの更新...
-
Access パラメータクエリをcsv...
-
期間の重複を調べるSQL文につい...
-
Unionした最後にGROUP BYを追加...
-
Updateの複数テーブル条件時のL...
おすすめ情報