私はこのテーブルを持っています:
activity - activity_id - (INT) PRIMARY,
item_id (INT),
user_id (INT)
lat (FLOAT),
lng (FLOAT),
created_at (DATETIME)
次のクエリを実行したいと思います。
SELECT item_id, count(distinct user_id) as c_c
FROM activity
WHERE (lat BETWEEN X and X and lng BETWEEN X and X)
and created_at >= DATE(NOW(), INTERVAL 15 DAY)
GROUP by item_id
ORDER by c_c desc
LIMIT 10
次のフィールドでインデックスを作成したと思いました。
lat,
lng,
created_at,
bid
つまり、非常に高速に実行されますが、それでも低速です。ここで最適なインデックスは何ですか? そこに user_id を含める必要はありますか?
どんな提案でも大歓迎です。
アップデート:
説明は次のとおりです。
+----+-------------+----------+-------+-----------------------------------------+---------+---------+------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+-----------------------------------------+---------+---------+------+-------+----------------------------------------------+
| 1 | SIMPLE | activity | index | lat,created_lat_lng,created_at,lat_user | item_id | 4 | NULL | 51510 | Using where; Using temporary; Using filesort |
+----+-------------+----------+-------+-----------------------------------------+---------+---------+------+-------+----------------------------------------------+
テーブルのインデックス:
+-----------------+----------------------+
| Name | Columns |
+-----------------+----------------------+
| lat | lat, lng |
| created_lat_lng | lat, lng, created_at |
| created_at | created_at |
| lat_user | lat,lng,user_id,item |
| item_id | item_id |
+-----------------+----------------------+