2016-07-15 7 views
0

これはおそらく、地球上で最も怠惰なmySQLクエリです。私はこの話題の専門家のふりをするつもりはありません。私はコミュニティに依存してサポートしています。MySQLが複数の内部結合を最適化する

私はクエリで実行する必要がある2つのテーブルがあります。 1つのテーブルは、リンクの2つの端を抽出するために内部結合されていなければなりません。次に、2つ目のテーブルを使用して地理的座標を抽出する必要があります。どちらが最初に行われなければならないかわからない。地理的切断が必要な場合もありますが、それはたぶん別の日の質問です。

フィルタリングは、FREQUENCYフィールドとLONG/LATボックスで行う必要があります。

サイドA ,,,,

サイドB ,,,,

TO:

サイドAしかし、最も重要なのは、同じテーブルDEVICE_DETAILSの列から変換するために一緒に参加しなければなりませんこの優れたを説明しなければならない、サイドB ,,,,,

は声明に参加する:

クエリは次のとおりです。

SELECT T.EFL_SYSTEM AS TX_EFL_SYSTEM, 
      T.SITE_ID AS TX_SITE_ID, 
      T.FREQUENCY AS TX_FREQUENCY, 
      T.DEVICE_TYPE AS TX_DEVICE_TYPE, 
      T.EIRP AS TX_EIRP, 
      T.LONGITUDE AS TX_LON, 
      T.LATITUDE AS TX_LAT, 
      R.EFL_SYSTEM AS RX_EFL_SYSTEM, 
      R.SITE_ID AS RX_SITE_ID, 
      R.FREQUENCY AS RX_FREQUENCY, 
      R.DEVICE_TYPE AS RX_DEVICE_TYPE, 
      R.EIRP AS RX_EIRP, 
      ST.LONGITUDE, 
      ST.LATITUDE, 
      SR.LONGITUDE, 
      SR.LATITUDE 
    FROM DEVICE_DETAILS T 
    INNER JOIN DEVICE_DETAILS R ON (T.EFL_SYSTEM=R.EFL_SYSTEM) AND (T.FREQUENCY=R.FREQUENCY) AND (T.DEVICE_TYPE != R.DEVICE_TYPE) 
    INNER JOIN SITE ST ON T.SITE_ID = ST.SITE_ID 
    INNER JOIN SITE SR ON R.SITE_ID = SR.SITE_ID 
    WHERE T.FREQUENCY > 7425000000 AND T.FREQUENCY < 7525000000 AND R.FREQUENCY > 7425000000 AND R.FREQUENCY < 7525000000 AND T.DEVICE_TYPE = 'T'; 

これらのテーブルである:DEVICE_DETAILSテーブルについて

CREATE TABLE `SITE` (
    `SITE_ID` VARCHAR(31) NOT NULL, 
    `LATITUDE` DECIMAL(18,14) NOT NULL, 
    `LONGITUDE` DECIMAL(18,14) NOT NULL, 
    `NAME` VARCHAR(1023) NOT NULL, 
    `STATE` VARCHAR(80) NOT NULL, 
    `LICENSING_AREA_ID` INT(3) NOT NULL, 
    `POSTCODE` VARCHAR(18) NOT NULL, 
    `SITE_PRECISION` VARCHAR(31) NOT NULL, 
    `ELEVATION` INT(5) NOT NULL 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=InnoDB 
; 

。いくつかのフィールドが欠落していますが、これは基本的なものです。私は毎朝CSV一括インポートを行うため、おそらく主キーはありません。私は後でこの部分を最適化しなければならないと思う。

+--------------------------------+----------------+------+-----+---------+-------+ 
| Field       | Type   | Null | Key | Default | Extra| 
+--------------------------------+----------------+------+-----+---------+-------+ 
| SDD_ID       | int(10)  | NO |  | NULL || 
| FREQUENCY      | bigint(20)  | NO |  | NULL || 
| BANDWIDTH      | int(15)  | NO |  | NULL || 
| CARRIER_FREQ     | bigint(20)  | NO |  | NULL || 
| EMISSION      | varchar(63) | NO |  | NULL || 
| DEVICE_TYPE     | varchar(1)  | NO |  | NULL || 
| TRANSMITTER_POWER    | int(20)  | NO |  | NULL || 
| SITE_ID      | varchar(31) | NO |  | NULL ||| 
| EFL_SYSTEM      | varchar(63) | NO |  | NULL || 
+--------------------------------+----------------+------+-----+---------+-------+ 

その点に関して感謝していただきました。

質問:

1-これらの複数のINNERは良い練習に参加していますか?他のどのオプションが最適化されていますか? 2私はCSVからINFILEインポート(毎日)を使用します。私はソース形式で再生することはできません。引き続きインデックスを追加できますか?それは輸入に影響を及ぼしますか?インデックス手法を最適化するために必要なものは何ですか? 3長方形/長方形の境界を指定してSITEテーブルにフィルタを追加できます - 操作を最適化するのに役立ちますか?

注:私のサイトテーブルは約11.5MB、DEVICE_DETAILSは約232.8MBです。私は8GBのRAMと8スレッドのプロセッサを持っています。

+0

、あなたの特定の問題/質問を明確にすることはできますか? – mhatch

+0

は、私は、私が達成しようとしている何のために適切な上記のアプローチに参加していますか?これは最適化できますか?現在、このクエリは永遠に使用されています。 –

+0

あなたは、MySQLは完全にそれがで動作するコンピュータのリソースを利用できるようにする必要があります。これは、デフォルトの設定が本当に古いコンピュータで動作するように設定されているので**設定する必要があることを意味します。あなたのクエリは永遠に取っています。なぜなら、MySQLがより速く動作するようにしていないからです。基本的には、クエリを適切に記述し、索引付けし、何も処理の半分ではありません。 –

答えて

0

テーブルにINDEXESを追加することで確実に最適化できます。

もっとここで読む:(非常に重要である)私の頭の上オフhttp://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html

、そしてあなたのデータを見ることなく、私はWHEREあなたのメインのインデックスを追加し、JOIN句することをお勧め:

ALTER TABLE DEVICE_DETAILS ADD INDEX FREQUENCY (FREQUENCY), ADD INDEX DEVICE_TYPE (DEVICE_TYPE), ADD INDEX SITE_ID (SITE_ID); 
ALTER TABLE SITE ADD INDEX SITE_ID (SITE_ID); 

また、私は(それが最適化のためではありません)あなたがバグを持っているかもしれないと思う - STに参加する必要があります句でこれを持っている:

ON T.SITE_ID = ST.SITE_ID 

の代わりに:

ON R.SITE_ID = ST.SITE_ID 
+0

は、第1の周波数で私のクエリフィルタを行い、その後、JOININGのでしょうか?また、複数のクエリに分解して、mySQLが最初に解決してからもう一方を解決する方が良いと思いますか? –

+0

また、私は言及を忘れた。私はLOAD DATA LOCAL INFILEを使用してcsvファイルから毎日データをインポートしています。私はCSVファイルの列を制御できません。フォーマットの不一致などによるインデックスの追加によるインポートの影響 –

+1

インデックスを追加することで、このクレイジーな速さが実現しました! 1クエリの継続時間:0.063秒。あなたの経験を共有してくれてありがとう。 –

関連する問題