我有一个这样的查询:
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 一起使用。 我可以做什么来调整这个查询?谢谢...
这不是重复的,请检查评论!
最佳答案
您可以使用该查询做的最好的事情是
INDEX(x, y) -- In this order
这将有效
WHERE x >= $x-$radius
AND x <= $x+$radius
但不适用于对 y
进行过滤。
并且它(可能)会避免 ORDER BY x ASC, y ASC
的“文件排序”。请注意,索引顺序必须与此顺序匹配。
为任何尝试的 SELECT
提供 EXPLAIN SELECT ...
。
并且,请在删除 MyISAM 之前切换到 InnoDB。
Here是一本关于 MySQL 索引的快速指南。
关于mysql - 我怎样才能索引-优化这个MySQL查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814704/