2016-05-13 4 views
3

ジオロケーション検索システムのデータベースをテストしています。アーク距離計算を実行する前に検索を絞り込むために、既にこのような正方形ボックスの長/ラジアンインデックスシステムに組み込まれた多くの最適化があります。私の目的は、1つのテーブルから10,000,000人のユーザーにサービスを提供することです。PHPから呼び出されたクエリ内のMySQL(MariaDB)実行タイムアウト

現在、私のクエリ時間は、年齢、性別などの他の条件に基づいて0.1秒から0.01秒の間です。これは、英国全体に均等に分布する10,000,000人のユーザーのためです。私はXをすることができ、ユーザXの人々を表示する必要があるとして、

私はLIMIT条件を持っている

他のユーザ、クエリができる一致/少数のユーザーが存在しない場合、問題がある16〜40 LIMITにすばやく到達できず、400,000行をスキャンする必要があるため、長い時間がかかります。

あり、私は見ることができ、他の最適化技術であることが、私の質問がある場合があります。クエリはX秒後に放棄し取得する方法は

ありますか? 1秒以上かかると結果が返ってこないので、これが起きてうれしいです。私は遅いクエリを殺すためにcronのソリューションについて考えているが、それがある16 GIVEUP

SECOND 1の後に....... LIMITテーブルFROM

SELECTデータ:疑似クエリのコードでは、のようなものになるでしょう非常に優雅ではない。プロダクションでは数秒ごとにクエリが呼び出されるので、cronは継続的にオンにする必要があります。

提案がありますか?

  • バージョンは、バージョン10.1でMariaDBを使用して
+0

バージョンのmysql? – asurbernardo

+0

可能な複製http://serverfault.com/questions/401828/how-to-automatically-kill-slow-mysql-queries-after-n-seconds –

+0

バージョンは10.1.14-MariaDB – PlatformDating

答えて

1

10.1.14-MariaDBで、あなたはあなたのクエリを制限する2つの方法があります。これは、時間または問合せされた行の合計に基づいて実行できます。行することにより

SELECT ... LIMIT ROWS EXAMINED rows_limit; 

あなたがを述べたようにあなたは(MariaDB 10.0以降)キーワードEXAMINEDを使用して、400000のようなラインの量を設定することができます。時間によって

max_statement_time変数が設定されている場合は、任意のクエリが中止されます実行するために(秒単位で指定)max_statement_time の値よりも長くかかっ( ストアドプロシージャを除きます)。これは、グローバルに、セッションごと、およびユーザーごと、およびクエリごとに に設定できます。

私が想像として、あなたが、特定のクエリのためにそれをしたい場合は、あなたがこれを使用することができます。

SET STATEMENT max_statement_time=1 FOR 
    SELECT field1 FROM table_name ORDER BY field1; 

max_statement_timeが(ミリ秒ですMySQLの、のちょうど反対側)秒に設定されていることに注意してください、あなたのケースに最適なものが見つかるまで変更することができます(MariaDB 10.1以降)

詳細情報が必要な場合は、クエリのタイムアウトについてこのexcellent postをお勧めします。

希望すると、これが役立ちます。

関連する問題