このクエリが速く実行されているのはどの索引になりますか? -- mysql フィールド と sql フィールド と database フィールド と indexing フィールド と inner-join フィールド 関連 問題

What index would insure this query runs fast?












-2
vote

問題

日本語

Hello私は3つのテーブルがあります<コード> room_id 、<コード>、 room_guests 。これらの各テーブルには何百万行の行があります。私は本質的に私のホテルに滞在したすべての時間を見つけようとしています。<コード> cus_num = 2342424324 は、以下のSQLの声明に滞在している部屋(私が欲しいものをします)。ただし、この声明を実行すると、とても遅いです。どうやってスピードアップできますか?正直なところ、私のSQLステートメントがひどく書かれているとはかなりよくわかります。より良いSQL文がありますか(<コード> INNER JOIN は非常に遅いかもしれません)?私はインデックスを作成できることを知っていますが、私はどんな列を一緒に索引付けする必要があるかはわからない。

主キー

  • <コード> person_id
  • <コード> room_id
  • <コード> guest_id

<事前> <コード> person_id | cus_num ---------------------- 1 | 82736424 2 | 238748923 3 | 32424 4 | 2342424324

室内

<事前> <コード> room_id | name ---------------------- 1 | Cool Room 2 | Hot Room 3 | Spring rooms 4 | apartment

room_guests

<事前> <コード> rooms0

SQL文

<事前> <コード> rooms1
英語

Hello I have 3 tables person and rooms, room_guests. I have millions of rows on each of these tables. I am essentially just trying to find all the times cus_num = 2342424324 stayed at my hotel and what rooms he stayed in with the sql statement below (does what I want). However, when I run this statement, it is VERY slow! How can I speed it up? Honestly, I'm fairly sure my sql statement is badly written. Is there a better sql statement (I feel INNER JOIN might be very slow)? I know I can create indexes as well, but I am unsure on what columns need to be indexed together.

Primary Keys

  • person_id
  • room_id
  • guest_id

person

person_id | cus_num ---------------------- 1         | 82736424 2         | 238748923 3         | 32424 4         | 2342424324 

rooms

room_id | name ---------------------- 1       | Cool Room 2       | Hot Room 3       | Spring rooms 4       | apartment 

room_guests

guest_id | room_id | person_id | last_update ---------------------------------------------------- 1        | 1       | 3         | 2019-02-03 12:00:43 2        | 4       | 2         | 2020-04-23 19:30:53 3        | 2       | 3         | 2018-12-21 08:34:29 4        | 3       | 1         | 2020-11-15 10:04:08 5        | 3       | 4         | 2019-05-09 11:53:31 

sql statement

SELECT rooms.name FROM rooms INNER JOIN room_guests ON rooms.room_id = room_guests.room_id INNER JOIN person ON room_guests.person_id = person_id WHERE person.cus_num = 2342424324 ORDER BY room_guests.last_update DESC 
</div
              
 
 

回答リスト

2
 
vote
vote
ベストアンサー
 

HMMM。 。 。

<事前> <コード> SELECT r.name FROM rooms r JOIN room_guests rg ON r.room_id = rg.room_id JOIN person p ON rg.person_id = p.person_id WHERE p.cus_num = 2342424324 ORDER BY rg.last_update DESC

インデックスを推薦する:

  • <コード> person(cus_num, person_id)
  • <コード> room_guests(person_id, room_id)
  • <コード> room(room_id)

これは where 節と public RssData select(long id){ Rssdata rv; Cursor cursor = database.query(TABLE_NAME, null, RSS_ID + " = ?", new String[]{String.valueOf(id)}, null, null, RSS_ID ); if (cursor.moveToFirst()){ String rssName = cursor.getString(NUM_RSS_NAME); String title = cursor.getString(NUM_RSS_TITLE); String link = cursor.getString(NUM_RSS_LINK); String description = cursor.getString(NUM_RSS_DESCRIPTION); } cursor.close(); //<<<< Should always close Cursors when done with them. return rv; } 0 sを処理します。クエリは public RssData select(long id){ Rssdata rv; Cursor cursor = database.query(TABLE_NAME, null, RSS_ID + " = ?", new String[]{String.valueOf(id)}, null, null, RSS_ID ); if (cursor.moveToFirst()){ String rssName = cursor.getString(NUM_RSS_NAME); String title = cursor.getString(NUM_RSS_TITLE); String link = cursor.getString(NUM_RSS_LINK); String description = cursor.getString(NUM_RSS_DESCRIPTION); } cursor.close(); //<<<< Should always close Cursors when done with them. return rv; } 1 にソートする必要があります。

 

Hmmm . . .

SELECT r.name FROM rooms r JOIN      room_guests rg      ON r.room_id = rg.room_id JOIN      person p      ON rg.person_id = p.person_id WHERE p.cus_num = 2342424324 ORDER BY rg.last_update DESC 

I would recommend indexes on:

  • person(cus_num, person_id)
  • room_guests(person_id, room_id)
  • room(room_id)

This handles the where clause and joins. The query will still need to sort for the order by.

</div
 
 
       
       

関連する質問

37  テーブルの1つの列だけに基づいて重複した値を除去する  ( Eliminating duplicate values based on only one column of the table ) 
マイクエリ: <事前> <コード> SELECT sites.siteName, sites.siteIP, history.date FROM sites INNER JOIN history ON sites.siteName = history...

-1  MySQL:結合をミキシングするときに不正確な結果を得る  ( Mysql getting inaccurate results when mixing joins ) 
私は3つのMySQLテーブルを持っています。以下の構造を確認してください。 患者 IDPatient(int - 主キー) 名前(VARCHAR) 年齢(VARCHAR) 常軸 IDComobility(int - 主キー) IDPatie...

0  CAMLクエリ結合エラー  ( Caml query join error ) 
私は以下のエラーを与えている投影フィールドクエリを持っています。 投影フィールド定義におけるショーフィールドの無効なフィールドタイプ 'フィールド名'。関連項目をクエリに追加できません。[エラー 0x80070057]クエリを実行できません:エラー0...

0  Oracleの結合最適化に関する支援  ( Assistance with join optimization in oracle ) 
一般的にSQLとプログラミングにはかなりご注意を払い、次のクエリのヘルプが必要です。時間の間実行され、タイムアウト/接続が閉じて終了します。 参加に関与するすべてのテーブルに合成インデックスを作成しましたが、それはまったく役に立たないようです。 このクエリは罰...

0  Pyspark DataFrame Inner Join -package $ TreeNODeexception  ( Pyspark dataframe inner join packagetreenodeexception ) 
IDを使用してPYSPARKデータフレーム間の内部結合をしています。 <事前> <コード> same_id=final_id.join(df_id, on="id", how="inner") same_id.count() final_idとdf_...

0  LINQ2SQL:クエリ内のエンティティタイプ '#some型#'の明示的な構築は許可されていません - 参加を使用して  ( Linq2sql explicit construction of entity type some type in query is not all ) 
私は問題のマッピングを持っています。私は "データシェーピング機能" - http://wlogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-querying-our-database.asp...

1  MySQL INNER結合だけでなく、存在しない場合もNULL  ( Mysql inner join but also null when not exist ) 
OK、 私はこれを一日全体にしましたが、MySQLでの私の知識は限られているようです。 次のテーブルを手に入れた: <事前> <コード> time_entries |id|comment|ticket_id| | 1|foo | 1| ...

3  大きな内部参加を効果的に数えて収容する  ( Effectively counting and suming on a large inner join ) 
次のケース(質問の簡略化)を検討してください。 SQL Server 2012データベースには、次の表があります。 <事前> <コード> Parent_Table Id | Parent table fields ----+---------------...

0  MySQL Inner Join '不明列'  ( Mysql inner join unknown column ) 
私はこれを読んでいました、そしてまだ私の照会がうまくいかない理由は意味がありません。それはかなり単純なインナー結合であり、私たちはMySQL5に取り組んでいます。私は知っています、Comasの上書きの参加の優先順位との結合との変化がありました。しかし、私はそれ...

0  WHERE句のSQL JOIN文  ( Sql join statement with where clause ) 
私はこの質問をしています、私は通り抜けようとしています。私は何時間もこれをやろうとしています、誰かが私たちを正しい方向に向けることができれば本当に素晴らしいでしょう。 これはドイツ語にあり、私は英語で翻訳するつもりです: パート(d)に問題しかない (d)レス...




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