まっすぐに使用するときは? -- mysql フィールド と join フィールド 関連 問題

When to use straight_join?












3
vote

問題

日本語

MySQLの注文はテーブルに参加しているのは、どのように選択されているのか、まっすぐになっているのはいつですか?

英語

What is the order MySQL joins the tables, how is it chosen and when does STRAIGHT_JOIN comes in handy?

</div
     
 
 

回答リスト

2
 
vote
vote
ベストアンサー
 

MySQL はネストされたループ(おそらくインデックスを使用して)することができるので、両方の結合テーブルが索引付けされている場合、<コード> A * log(B) として A * log(B) として計算することができます。 CODE> A は、<コード> B が先頭である場合、<コード> B * log(A) です。

<コード> WHERE 条件を満たすレコードの少ないテーブルを先導することが簡単です。

<コード> WHERE 条件、<コード> 99887669 <コード> B < @IBAction func btnDeleteCell(_ sender: UIButton) { let UC = UserControllers() let parentViewController = PatientPersonalInfoViewController() UC.deleteSocialPlatform(indexRow) { (socialplatformArray) in parentViewController.userSocialPlatform = socialplatformArray } DispatchQueue.main.async { self.parentCollectionView!.reloadData() } print(indexRow) } 6など)など、結合パフォーマンスに影響を与える他の要因があります。 は、結合注文の時間を予測し、統計が最新のものである場合はかなりうまくいきます。

<コード> @IBAction func btnDeleteCell(_ sender: UIButton) { let UC = UserControllers() let parentViewController = PatientPersonalInfoViewController() UC.deleteSocialPlatform(indexRow) { (socialplatformArray) in parentViewController.userSocialPlatform = socialplatformArray } DispatchQueue.main.async { self.parentCollectionView!.reloadData() } print(indexRow) } 2 は、統計が正確ではない(言う、自然に傾く)、またはオプティマイザのバグの場合に役立ちます。

例えば、以下の空間結合:

<事前> <コード> @IBAction func btnDeleteCell(_ sender: UIButton) { let UC = UserControllers() let parentViewController = PatientPersonalInfoViewController() UC.deleteSocialPlatform(indexRow) { (socialplatformArray) in parentViewController.userSocialPlatform = socialplatformArray } DispatchQueue.main.async { self.parentCollectionView!.reloadData() } print(indexRow) } 3

は結合スワップ(小さいテーブルが先行する)の対象であるが、<コード> @IBAction func btnDeleteCell(_ sender: UIButton) { let UC = UserControllers() let parentViewController = PatientPersonalInfoViewController() UC.deleteSocialPlatform(indexRow) { (socialplatformArray) in parentViewController.userSocialPlatform = socialplatformArray } DispatchQueue.main.async { self.parentCollectionView!.reloadData() } print(indexRow) } 4 は<コード> @IBAction func btnDeleteCell(_ sender: UIButton) { let UC = UserControllers() let parentViewController = PatientPersonalInfoViewController() UC.deleteSocialPlatform(indexRow) { (socialplatformArray) in parentViewController.userSocialPlatform = socialplatformArray } DispatchQueue.main.async { self.parentCollectionView!.reloadData() } print(indexRow) } 5 に変換されず、結果として得られる計画はインデックス。

この場合は、 @IBAction func btnDeleteCell(_ sender: UIButton) { let UC = UserControllers() let parentViewController = PatientPersonalInfoViewController() UC.deleteSocialPlatform(indexRow) { (socialplatformArray) in parentViewController.userSocialPlatform = socialplatformArray } DispatchQueue.main.async { self.parentCollectionView!.reloadData() } print(indexRow) } 6 を使用して結合順序を明示的に設定する必要があります。

 

MySQL is only capable of doing nested loops (possibly using indexes), so if both join tables are indexed, the time for the join is calculated as A * log(B) if A is leading and B * log(A) if B is leading.

It is easy to see that the table with fewer records satisfying the WHERE condition should be made leading.

There are some other factors that affect the join performance, such as WHERE conditions, ORDER BY and LIMIT clauses etc. MySQL tries to predict the time for the join orders and if statistics are up to date does it quite well.

STRAIGHT_JOIN is useful when the statistics are not accurate (say, naturally skewed) or in case of bugs in the optimizer.

For instance, the following spatial join:

SELECT  * FROM    a JOIN    b ON      MBRContains(a.area, b.area) 

is subject to a join swap (the smaller table is made leading), however, MBRContains is not converted to MBRWithin and the resulting plan does not make use of the index.

In this case you should explicitly set the join order using STRAIGHT_JOIN.

</div
 
 
     
     
2
 
vote

他の人がオプティマイザについて述べられており、どのテーブルがより小さな結果セットの基準を満たすことができるが、それは常に機能するとは限らないかもしれない。私が契約/補助金を取得していなかったように働いていたように。テーブルは14百万のレコードでした。しかし、それはまた20を超えるルックアップテーブル(州、議会地区、ビジネス分類の種類、所有者民族性など)

とにかくこれらの小さいテーブルを使用すると、結合は小さなルックアップの1つを使用していて、マスターテーブルに戻ってから他のすべてのものに参加していました。データベースを切り取って30時間以上のクエリをキャンセルしました。私の主なテーブルが最初にリストされていて、その後のすべてのものがルックアップして参加した後、一番上にリストされていた順序でcredent_joinを追加し、複雑なクエリがもう2時間後に再び実行されていました(予想されなければならない)。 。

後続のすべてのエクストラ以降の先頭へのあなたの主な基礎であるものは何でも取得しました、私が見つけました、間違いなく役に立ちます。

 

As others have stated about the optimizer and which tables may meet the criteria on smaller result sets, but that may not always work. As I had been working with gov't contract / grants database. The table was some 14+ million records. However, it also had over 20 lookup tables (states, congressional districts, type of business classification, owner ethnicity, etc)

Anyhow with these smaller tables, the join was using one of the small lookups, back to the master table and then joining all the others. It CHOKED the database and cancelled the query after 30+ hours. Since my primary table was listed FIRST, and all subsequent were lookup and joined AFTER, just adding STRAIGHT_JOIN at the top FORCED the order I had listed and the complex query was running again in just about 2 hrs (expected for all it had to do).

Get whatever is your primary basis to the top with all subsequent extras later I've found, definitely helps.

</div
 
 
 
 
1
 
vote

テーブルの順序はオプティマイザによって指定されます。オプティマイザがそれを間違っているとき、straight_joinは便利で、それはそれほど頻繁ではありません。私はBig Joinでそれを1回だけ使用しました。ここで、オプティマイザは最初に参加して1つの特定のテーブルを与えました(私はExplain selectコマンドでそれを見ました)ので、それが結合の後半に結合されるようにテーブルを置きました。それはクエリをスピードアップするためにたくさんのを助けました。

 

The order of tables is specified by the optimizer. Straight_join comes in handy when the optimizer does it wrong, which is not so often. I used it only once in a big join, where the optimizer gave one particular table at first place in join (I saw it in explain select command), so I placed the table so that it is joined later in the join. It helped a lot to speed up the query.

</div
 
 

関連する質問

0  (My)SQLの行セットと値の比較の一連の作業  ( Working with sets of rows in mysql and comparing values ) 
テーブルのレコードのセットに対して比較的単純な操作をするためのSQLを把握しようとしていますが、私は立ち往生しています。アイテムごとに複数の行を含むテーブルを考えてください。すべて共通のキーで識別されます。 例えば: <事前> <コード> serial mod...

3  SQLはどのようにして仕事をしますか?  ( How does sql join work ) 
参加がどのように内部的に機能するのかを理解しようとしています。次の2つのクエリが実行される方法の違いは何ですか? <事前> <コード> For example (A) Select * FROM TABLE1 FULL JOIN TABLE2 ON TA...

1  データを返すためにクエリに参加しました  ( Joined query to return data ) 
結合が存在する場合にのみデータを返す次のクエリがあります。別のクエリを作成せずにこれらのテーブルの間に関係がない場合でも、最後に参加したテーブル(#__unis)のデータから戻ってくるのですか? <事前> <コード> select * from #__...

1  この複雑な自己結合を書く方法  ( How to write this complex self join ) 
与えられたフィールドの2つのテーブルがあります ハイショーラ 名前 グレード id いいね id1 id2 高校生に情報を保持し、高校で誰が誰が好きな人を示す関係テーブルである。 ID1を持つ学生はID2を持つ学生が好きです。 一...

1  TSQLアップデートの問題  ( Tsql update issue ) 
OK SQL Serverファンには、SQL Server 2008 R2インスタンスの内側にあるレガシーストアドプロシージャーがあり、最小のものが恐ろしいことを示すPRODデータでも継承しています。また、データやテーブル構造を変更することはできません。 ...

1  条件で2つの異なる列から選択してSQLからそれらを結合する方法  ( How to select from two diffrent columns in condition and join them from sql ) 
私は1つの列として2つの列に参加しようとしています...ここにアイデアがあります。 <事前> <コード> ======================================================= id | firstname ...

0  ネスト選択セレクト  ( Nested select select ) 
これは前の質問のオフショーです - 私はこののようなコードを持っています <事前> <コード> select EMPLOYEE_NAME, HIRE_DATE, IFNULL(SALARY,0), manag...

5  Oracleの複数のテーブルアップデート  ( Multiple table update in oracle ) 
参加を使用して単一のクエリを使用して、複数のテーブルをOracleで更新することは可能ですか?もしそうなら、構文は何ですか?私の同僚は、彼がMySQLでそれをしたことを言った。 更新 - 私がやろうとしていることはこのようなものです <事前> <コード> ...

2  表1から表2まで2列の接合  ( Joining 2 columns from table1 to table 2 ) 
表2の2列に表1列を参照しますか? 私は50の正確な行でテーブル ' 'を作成しました '結婚式'テーブルに関連しようとしている(WeddingState、ContactState) これは私が作成した声明ですが、トップ WeddingState を正しく結...

0  MySQLクエリ相互参照  ( Mysql query cross reference ) 
PHPを使用する(PHPを使用)ために(PHPを使用)ために(PHPを使用)、Cross_Check.LastMod の場合だけ別のテーブルを表示します。 t_one <事前> <コード> guid | name | lastmod 1 | ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有