[英]How can I index - optimize this MySQL query?
我有这样的查询:
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。
这是有关在MySQL中建立索引的快速指南。
因此,我添加了索引gmp
其中包含x, y, id, terrain, occupied, c_type
和EXPLAIN SELECT显示列:
id: 1
select_type: SIMPLE
table: map
type: range
possible_keys: gmp
key: gmp
key_len: 8
ref: NULL
rows: 1955
Extra: Using where; Using index
所以,我想它现在可以工作了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.