フレーム テーブルは非常に大きいですが、この場合に検索されるフレームを 50 未満に下げる別の値があります。実際にはパターンはなく、各フレームは前の停止と同じ gpstime で開始します。
検索フレーム数をどのように 50 に減らしたのかよくわかりませんが、たとえばgpstime
50 だけで 10,000 個の値を検索している場合frames
、これらの 50 フレームを RAM にロードし、検索を実行するのがおそらく最も簡単です。 Python、foobarbecueの答えに似たものを使用しています。
gpstime
ただし、たとえば 10,000,000 を持つテーブル全体で 10 個の値を検索する場合、frames
10,000,000 フレームすべてを RAM にロードしたくない場合があります。
次のインデックスを追加することで、DBに同様のことをさせることができます...
ALTER TABLE myapp_frames ADD UNIQUE KEY my_key (start_gps, stop_gps, frame_name);
...次に、このようなクエリを使用して...
(SELECT frame_name FROM myapp_frames
WHERE 2.5 BETWEEN start_gps AND stop_gps LIMIT 1)
UNION ALL
(SELECT frame_name FROM myapp_frames
WHERE 4.5 BETWEEN start_gps AND stop_gps LIMIT 1)
UNION ALL
(SELECT frame_name FROM myapp_frames
WHERE 7.5 BETWEEN start_gps AND stop_gps LIMIT 1);
...戻ります...
+------------+
| frame_name |
+------------+
| Frame 2 |
| Frame 4 |
| Frame 7 |
+------------+
...そして、どのEXPLAIN
ショーのために...
+----+--------------+--------------+-------+---------------+--------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+--------------+-------+---------------+--------+---------+------+------+--------------------------+
| 1 | PRIMARY | myapp_frames | range | my_key | my_key | 8 | NULL | 3 | Using where; Using index |
| 2 | UNION | myapp_frames | range | my_key | my_key | 8 | NULL | 5 | Using where; Using index |
| 3 | UNION | myapp_frames | range | my_key | my_key | 8 | NULL | 8 | Using where; Using index |
| NULL | UNION RESULT | <union1,2,3> | ALL | NULL | NULL | NULL | NULL | NULL | |
+----+--------------+--------------+-------+---------------+--------+---------+------+------+--------------------------+
...そのため、そのインデックスにヒットする 1 つのクエリですべてのルックアップを実行でき、インデックスは RAM にキャッシュする必要があります。