where句の計算でSQLクエリの速度を最適化する方法

ilya bogackiy

私のテーブルには約300万件のレコードがあります。このクエリを実行すると、カウント値をフェッチするのに約15〜30秒かかります

SELECT COUNT(*) AS `neighbours_count` FROM house 
WHERE 
    ( 6371 * 
          acos( 
              cos( radians( "48.70877900" ) ) * 
              cos( radians( `map_y` ) ) * cos( radians( `map_x` ) - 
              radians( "37.49893200" ) ) + sin( radians( "48.70877900" ) 
          ) 
          * sin( radians( `map_y` ) ) ) 
    ) <= 0.3

クエリ自体は、特定の座標から300メートル以内の建物をカウントします。6371は地球半径で、残りの部分は座標への近接度を計算する式です。

クエリの説明

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   SIMPLE  house   ALL     NULL    NULL    NULL    NULL    2442710     Using where

ステートメントの作成

CREATE TABLE IF NOT EXISTS `house` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country_id` int(11) NOT NULL,
  `state_id` int(11) NOT NULL,
  `city_id` int(11) NOT NULL,
  `street_id` int(11) NOT NULL,
  `name` varchar(250) NOT NULL,
  `map_x` decimal(11,8) NOT NULL,
  `map_y` decimal(11,8) NOT NULL,
  UNIQUE KEY `id` (`id`),
  KEY `country_id` (`country_id`),
  KEY `city_id` (`city_id`),
  KEY `street_id` (`street_id`),
  KEY `map_x` (`map_x`),
  KEY `map_y` (`map_y`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='map_y - latitude, map_x - longitude' AUTO_INCREMENT=2442769 ;

このクエリを最適化する方法についてアドバイスをお願いします。

ゴードン・リノフ

クエリを実際に最適化する方法はいくつかあります。1つの方法は、条件を追加することです。

where (max_x between A and B and max_y between C and D) and
      . . .

これに伴う問題は、との両方max_yインデックスを使用できないことですmax_xバリエーションは、各側に300メートルのグリッドを課し、各ポイントを最も近いグリッドポイントに移動することです。これは実装するのが少し面倒です(トリガーなどが必要です)。しかし、あなたはあなたの状態が物事が隣接するグリッドポイントにあることを意味することを知っています。だから、このようなもの:

where (grid_x, grid_y) in ((grid_A-1, grid_B), (grid_A-1, grid_B-1), (grid_A-1, grid_B+1),
                           (grid_A, grid_B), (grid_A, grid_B-1), (grid_A, grid_B+1),
                           (grid_A+1, grid_B), (grid_A+1, grid_B-1), (grid_A+1, grid_B+1)
                          ) and
       . . .

これは上のインデックスを利用することができgrid_x, grid_yます-私は思います。そうでない場合は、を使用して同じ効果を得ることができますunion all

本当に、最良のオプションは地理空間拡張です。GISクエリは、一般的なリレーショナルデータベースデータとは異なるデータ構造を使用するため、拡張機能が必要です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

WHERE句で算術演算を使用するクエリの最適化

分類Dev

SQLServerクエリのwhere句を最適化する方法

分類Dev

where句のmaxを使用してOracleでクエリを最適化する方法

分類Dev

node.jsのarray.forEachで計算速度を最適化する方法

分類Dev

MySQLでwhere句クエリを最適化する

分類Dev

WHERE句のandまたはand構造を使用してSQLクエリを最適化する

分類Dev

このクエリの計算を最適化しますか?

分類Dev

SQLクエリの相互適用を最適化する方法

分類Dev

このforループの計算速度を最適化する方法は?

分類Dev

列挙型のwhereクエリを最適化する方法

分類Dev

SQLクエリ-特定の集計列にさまざまな条件(Where句?)を適用する方法

分類Dev

WHERE句でのMySQLクエリの最適化

分類Dev

to_charを含むwhere句クエリを最適化する方法

分類Dev

スクリプトの速度を最適化する方法は?

分類Dev

Selectおよびwhere句でMYSQLクエリTIMEDIFFを最適化する

分類Dev

2つの選択でSQLクエリを最適化する

分類Dev

Mysqlはwhere句のサブクエリを最適化します

分類Dev

MySQLと2つの「where」句を使用して最長ストリークを計算する方法

分類Dev

エポック時間範囲のwhere句を含むこのmysqlクエリを最適化するにはどうすればよいですか?

分類Dev

SQL Server 2008でクエリ結果を最適化するための最良の方法は何ですか?

分類Dev

日時の違いを計算するためのクエリを最適化する

分類Dev

SQLクエリで計算列の重複計算を回避する方法

分類Dev

SQLクエリを最適な方法で暗号化する方法は?

分類Dev

テーブルクエリ速度MYSQLを最適化する方法

分類Dev

MySQLクエリ「count(*)」を「group by」句で最適化する

分類Dev

where条件の多くの組み合わせでMySQLクエリを最適化する方法は?

分類Dev

where条件の多くの組み合わせでMySQLクエリを最適化する方法は?

分類Dev

2つのnumpy配列のカテゴリクロスエントロピーを計算するこの関数を最適化する方法

分類Dev

先月の請求書の計算に使用されたクエリを最適化する

Related 関連記事

  1. 1

    WHERE句で算術演算を使用するクエリの最適化

  2. 2

    SQLServerクエリのwhere句を最適化する方法

  3. 3

    where句のmaxを使用してOracleでクエリを最適化する方法

  4. 4

    node.jsのarray.forEachで計算速度を最適化する方法

  5. 5

    MySQLでwhere句クエリを最適化する

  6. 6

    WHERE句のandまたはand構造を使用してSQLクエリを最適化する

  7. 7

    このクエリの計算を最適化しますか?

  8. 8

    SQLクエリの相互適用を最適化する方法

  9. 9

    このforループの計算速度を最適化する方法は?

  10. 10

    列挙型のwhereクエリを最適化する方法

  11. 11

    SQLクエリ-特定の集計列にさまざまな条件(Where句?)を適用する方法

  12. 12

    WHERE句でのMySQLクエリの最適化

  13. 13

    to_charを含むwhere句クエリを最適化する方法

  14. 14

    スクリプトの速度を最適化する方法は?

  15. 15

    Selectおよびwhere句でMYSQLクエリTIMEDIFFを最適化する

  16. 16

    2つの選択でSQLクエリを最適化する

  17. 17

    Mysqlはwhere句のサブクエリを最適化します

  18. 18

    MySQLと2つの「where」句を使用して最長ストリークを計算する方法

  19. 19

    エポック時間範囲のwhere句を含むこのmysqlクエリを最適化するにはどうすればよいですか?

  20. 20

    SQL Server 2008でクエリ結果を最適化するための最良の方法は何ですか?

  21. 21

    日時の違いを計算するためのクエリを最適化する

  22. 22

    SQLクエリで計算列の重複計算を回避する方法

  23. 23

    SQLクエリを最適な方法で暗号化する方法は?

  24. 24

    テーブルクエリ速度MYSQLを最適化する方法

  25. 25

    MySQLクエリ「count(*)」を「group by」句で最適化する

  26. 26

    where条件の多くの組み合わせでMySQLクエリを最適化する方法は?

  27. 27

    where条件の多くの組み合わせでMySQLクエリを最適化する方法は?

  28. 28

    2つのnumpy配列のカテゴリクロスエントロピーを計算するこの関数を最適化する方法

  29. 29

    先月の請求書の計算に使用されたクエリを最適化する

ホットタグ

アーカイブ