mysql - 我怎样才能索引-优化这个MySQL查询?

标签 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 一起使用。 我可以做什么来调整这个查询?谢谢...

这不是重复的,请检查评论!

最佳答案

您可以使用该查询做的最好的事情是

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/

相关文章:

c# - IEnumerable 在使用后是否存储对象

Mysql 不能在 wamp 上运行,图标仍然是橙色

python - 这两种实现 `on duplication increment` 的方法有什么区别?

mysql - 高效查询多语言类别和类别项

php - 如何使用php在数据库中的DateTime列类型中插入日期时间对象

sql - ORA-00933: SQL 命令未在带有 join 的子查询中正确结束

angular - 调用插值,即使 ChangeDetectionStrategy.OnPush

sql - JPA,获取所有元素

mysql - 使用 max 时 select 返回错误的 id

jQuery 在 iPad 上运行速度极慢