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

时间:2017-03-15 15:52:10

标签: mysql sql performance indexing

我有这样的查询:

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一起使用。 我该怎么做才能调整此查询?感谢...

这不重复,请查看评论!

2 个答案:

答案 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

所以,我猜它现在有用了。