我有这样的查询:
SELECT id, terrain, occupied, c_type
FROM map
WHERE x >= $x-$radius
AND x <= $x+$radius
AND y >= $y-$radius
AND y <= $y+$radius
ORDER BY
x ASC,
y ASC
我的表格如下:
CREATE TABLE `map` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`occupied` tinyint(2) NOT NULL DEFAULT '0',
`c_type` tinyint(4) NOT NULL DEFAULT '0',
`x` int(11) NOT NULL,
`y` int(11) NOT NULL,
`terrain` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4_general_ci
我删除了除PRIMARY KEY之外的所有索引,因为我不确定索引如何与SQL一起使用。 我该怎么做才能调整此查询?感谢...
这不重复,请查看评论!
答案 0 :(得分:0)
使用 查询
可以做的最好的事情INDEX(x, y) -- In this order
这对
有效WHERE x >= $x-$radius
AND x <= $x+$radius
但不适用于y
的过滤。
它(可能)会避免ORDER BY x ASC, y ASC
的“filesort”。请注意,索引顺序必须与此顺序匹配。
为所有尝试的EXPLAIN SELECT ...
提供SELECT
。
并且,请在移除MyISAM之前切换到InnoDB。
Here是关于MySQL索引的快速手册。
答案 1 :(得分:0)
因此,我添加了列dependency2
的索引gmp
并显示了EXPLAIN SELECT:
x, y, id, terrain, occupied, c_type
所以,我猜它现在有用了。