これはおそらく、地球上で最も怠惰な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スレッドのプロセッサを持っています。
、あなたの特定の問題/質問を明確にすることはできますか? – mhatch
は、私は、私が達成しようとしている何のために適切な上記のアプローチに参加していますか?これは最適化できますか?現在、このクエリは永遠に使用されています。 –
あなたは、MySQLは完全にそれがで動作するコンピュータのリソースを利用できるようにする必要があります。これは、デフォルトの設定が本当に古いコンピュータで動作するように設定されているので**設定する必要があることを意味します。あなたのクエリは永遠に取っています。なぜなら、MySQLがより速く動作するようにしていないからです。基本的には、クエリを適切に記述し、索引付けし、何も処理の半分ではありません。 –