2017-07-20 3 views
2

私は50kk以上の行を持つテーブルを持っています。MySQLクエリの値のリスト

トラックポイント:

+----+------------+-------------------+ 
| id | created_at | tag    | 
+----+------------+-------------------+ 
| 1 | 1484407910 | visitorDevice643 | 
| 2 | 1484407913 | visitorDevice643 | 
| 3 | 1484407916 | visitorDevice643 | 
| 4 | 1484393575 | anonymousDevice16 | 
| 5 | 1484393578 | anonymousDevice16 | 
+----+------------+-------------------+ 

'のcreated_at' が行のタイムスタンプが追加されます。 と私はタイムスタンプのリストを持っているが、このような例:

timestamps = [1502744400, 1502830800, 1502917200] 

IはIとI +タイムスタンプの1間の間隔ごとに、すべてのタイムスタンプを選択する必要があります。それは次のようになりますDjangoのORMを使用して

:実際にリストをタイムスタンプのので

step = 86400 
for ts in timestamps[:-1]:  
    trackpoint_set.filter(created_at__gte=ts,created_at__lt=ts + step).values('tag').distinct().count() 

は非常に非常に長いとテーブルで行の多くを持って、最終的に私は500タイムアウト

を取得し、私の質問は1つの未処理のSQLクエリの行と値のリストを結合する方法[(1502744400, 650), (1502830800, 1550)...]

ここで、2番目の値はタイムスタンプで、2番目の値は各間隔の一意のタグの数です。

+0

650とは何ですか? 1550は何ですか?参照:[私は非常に単純なSQLクエリと思われるものに対してMCVEを提供するのはなぜですか?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve- for-what-like-to-me-to-be-a-very-simple-sql-query) – Strawberry

+0

ありがとう、私の質問を修正しました –

+0

created_atのインデックスを持っていますか?大規模なクエリの場合、インデックスを使用すると大幅なパフォーマンスが向上する可能性があります。 –

答えて

1

最初のインデックスcreated_at。次に、created_at in (timestamp, timestamp+1)のようなクエリを作成します。タイムスタンプごとに、一度にすべてではなく、1つずつクエリを実行します。

+0

私が言ったように、テーブルが非常に大きく配列がずっと長いので、私は504 Gateway Time-outを得ます –

+0

一度に一つのバッチを試してください。 – kawadhiya21

+0

申し訳ありませんが、私のステップIDが1日(86400秒)の期間で10分(600秒)であれば、実際には144回繰り返されます。そして最後に私は504 –