繁体   English   中英

如何索引-优化此MySQL查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM