• ベストアンサー

【mysql】リレーションでパフォーマンスが落ちる

mysqlで SELECT文を作成しています。  諸事情であるテーブルとテーブルを1対1の関係でプライマリーキー同士でつないでいます。 この時、Aというテーブル と Bというテーブルでつないでるとして Aテーブルにあるカラムのみを使ってでソートする場合パフォーマンスは問題なく Bテーブルにあるカラムのみでソートする場合もパフォーマンスに問題はありません。 しかし、Aテーブル Bテーブルのカラムを組み合せてソートすると パフォーマンスが極端に落ちてしまいます。 これを改善する方法はないでしょうか?

  • MySQL
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

テーブルをまたがったインデックスは貼れないのでその辺の問題でしょうか 本質的には同じテーブルで管理するしか解決方法はないかもしれません 地道にexplainでチェックしながらindexの利き具合をテストしてみてください

yuzuru0024
質問者

お礼

回答有難うございます。 ソートするときは、なるべくリレーションさせないようにするしか なさそうですね。

関連するQ&A

  • mySQL プライマリーキーのカラム名を取得したい

    mySQLで、そのテーブルのプライマリーキーのカラム名を取得する方法を 教えてください。 よろしくお願いします。 http://oshiete1.goo.ne.jp/qa3699289.html のようなSQL文で取得できるのが理想です。

    • ベストアンサー
    • MySQL
  • MySQL区切った文字列で外部結合はできない?

    MySQLの外部結合について教えてください 「結合の対象となっているカラムの値が一致」は必須なのでしょうか? ■やりたいこと ・Aテーブルaカラム内にある「デリミタの先頭文字列」を抽出して、Bテーブルのidカラムと結合したい ■最終的にやりたいこと ・上記一致条件で、両テーブルデータをSELECTしたい ■試したこと ・「SELECT SUBSTRING_INDEX」で「デリミタの先頭文字列」を抽出できたのですが、そこで行き詰まりました ■質問 ・そもそもやろうとしていることが無謀なのでしょうか? ・テーブル構成を見直した方が良いのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLでテーブル一致条件に正規表現は使用可能?

    ・MySQLで一致条件に正規表現を使用することは出来ますか? ・もし出来るとすればどのようにすれば良いでしょうか? ■やりたいこと ・aテーブルのurlカラム内容が「/color/★★」だったら「/color/」以下の★★を抽出して、bテーブルのidと一致したレコードを抽出したい ・aテーブルの★★と、bテーブルのidカラムが一致しているレコードが欲しい ・aテーブルのurlカラムには「/color/58」「/color/26」「/hoge/■■」などが入っています SELECT *     FROM a      LEFT JOIN a.url = b.id     REGEXP '^(/color)'?     where a.★★ = b.id

    • ベストアンサー
    • MySQL
  • MYSQL バイナリーデータに変換して取得

    MYSQLでSELECTして以下のテーブルのCODEカラムからバイナリーデータに変換してデータを取得したいのですが、どうしたら良いでしょうか? SELECT CODE FROM TABLE_NEME WHERE ID='XXX' <テーブルデータ> CODE(varchar型) 011A00046D0ADC4B

    • ベストアンサー
    • MySQL
  • 【MySQL】1対1でテーブルをあえて分ける

    mysqlを使用してデータベースを作成しているのですが データベースでテーブルを分けるときって 【アカウントテーブル】 ID アカウント 名 アカウント パスワード 名前 住所 電話番号 職業 【職業テーブル】 職業ID 職業名 というような1対多というのはよく組むとおもうんですが 下記のような 【アカウント情報テーブル(アカウント情報)】 アカウントID アカウント 名 アカウント パスワード 【アカウント情報テーブル(プロフィール情報)】 アカウントID 名前 住所 電話番号 職業 1対1の関係でテーブルをジャンル(エンティティ)ごとに複数にわけて あとでリレーションして一個にまとめるというのはデータベース的にあまりよろしくないのでしょうか? 何故、こんなことしたいかというと、1テーブルあたりのカラム数がかなり多くなってくると PHPでデータベースを書き込んだり呼び出したりする時に毎度多くのカラムを取り扱わなければならず SELECTで、カラムを一個一個選んで行かないといけません。 しかし、取り扱いたいカラムは大抵の場合あるジャンルだけなので リレーションするかしないかで、あるジャンルのデータだけを取り扱えれば 効率がよくなるのでは? というのがあります。 また、視覚的にカラムの把握もしやすくなります。 この1対1テーブルは、DB設計的にどうなでしょうか?

    • ベストアンサー
    • MySQL
  • INDEXと検索

    INDEXが着いていないカラムをSELECTで検索しても他のカラムにプライマリーキーがあれば、検索は高速になるのでしょか? テーブル ID、NAME IDにプライマリーキーが付いていて、NAMEのカラムのみを検索するときにも高速になるのでしょうか?

    • ベストアンサー
    • MySQL
  • SELECT時のパフォーマンス

    ケースA:[SELECT文]-[DB2].[ビュー]-[DB1].[テーブル] ケースB:[SELECT文]-[DB2].[テーブル] [テーブル]はどちらも同じ内容です。 ケースAは[DB1]にある[テーブル]を[DB2]の[ビュー]を通して見てます。 ケースBは[DB2]に[DB1]の[テーブル]と同じ物をコピーしています。 同じSELECT結果を表示するSQLで ケースAとケースBでパフォーマンス的に差が出るのでしょうか? 私が思うのはケースAの場合別DBにあるテーブルをビューを使って 見てる事によって、DBやテーブルへのアクセス権限等の 確認処理でパフォーマンスが低下すると思うのですが 推定実行プランやプロファイラで見てもよく分かりませんでした。 些細な事でも構いませんので、教えてくださいませ。

  • MySQLのトリガの制御文について

    MySQLのトリガで次のようなコーディングを行いましたが、エラーが発生して、動作しません。 ------------------------------------------------------------------------------------------------- begin UPDATE テーブルA SET テーブルAカラムX = 値, テーブルAカラムY = 値, CASE WHEN テーブルAカラムZ = 1 THEN テーブルAカラムR = 1 WHEN テーブルAカラムZ = 2 THEN テーブルAカラムR = 2 END; end -------------------------------------------------------------------- ENDをEND CASEにしたり消したり、;を色々な位置につけたり消したりしましたが、エラーが発生します。 ストアドの方でselect文中にif文やcase文を入れましたが、エラーが発生します。 大変困っております。 ご協力をお願い致します。 各バージョンは最新バージョンとします。

    • ベストアンサー
    • MySQL
  • mysql_fetch_array結果の配列化

    【ご質問】 あるselect文を実行し、mysql_fetch_arrayで取得した結果を配列したいのですが、どのようにしたら実現できるでしょうか? 【例】 select文の結果で3レコードヒットした場合、 カラム1 カラム2 カラム3 a b c d e f g h i a⇒カラム1[1]、b⇒カラム2[1]、c⇒カラム3[1] d⇒カラム1[2]、e⇒カラム2[2]、f⇒カラム3[2] g⇒カラム1[3]、h⇒カラム2[3]、i⇒カラム3[3]      と配列化したいのです。 ご教授宜しくお願いいたします。

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL