フレーム テーブルは非常に大きいですが、この場合に検索されるフレームを 50 未満に下げる別の値があります。実際にはパターンはなく、各フレームは前の停止と同じ gpstime で開始します。
検索フレーム数をどのように 50 に減らしたのかよくわかりませんが、たとえばgpstime50 だけで 10,000 個の値を検索している場合frames、これらの 50 フレームを RAM にロードし、検索を実行するのがおそらく最も簡単です。 Python、foobarbecueの答えに似たものを使用しています。
gpstimeただし、たとえば 10,000,000 を持つテーブル全体で 10 個の値を検索する場合、frames10,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 にキャッシュする必要があります。