有一个这样的请求:
SELECT *
FROM `pet`
WHERE (`unite_id` IS NULL)
AND ((`status`=1) OR ((`status`=4) AND (`delete_reason` IN (1, 2, 5))))
AND ((`pet`.`latitude` BETWEEN '55.750958149654984' AND '55.76893750736974') AND (`pet`.`longitude` BETWEEN '37.416257858276374' AND '37.432994842529304'))
ORDER BY `premium_on` DESC, `date` DESC, `created_at` DESC LIMIT 100;
查询时间:2.921469锁定时间:0.000001发送的行数:28检查的行数:656110受影响的行数:0发送的字节数:46395
id | 选择类型 | 桌子 | 分区 | 类型 | 可能的键 | 键 | key_len | 参考 | 行 | 过滤 | 额外 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 简单 | 宠物 | \N | 索引 | 状态,idx_pet_geo_opt,idx_pet_geo | 高级版 | 12 | \N | 101 | 0,12 | 使用地点;向后索引扫描 |
索引
premium_on
来自 3 个字段:premium_on、date、created_at。
我可以做什么来加速这个查询?我对按纬度和经度的正方形搜索特别感兴趣
尝试按如下方式创建复合索引:
ALTER TABLE pet ADD INDEX box (status, unite_id, latitude);
这应该足以支持您的查询,以便对您的
latitude
列进行范围扫描。您仍然应该看看查询计划。