【发布时间】:2017-03-15 15:52:09
【问题描述】:
我有一个这样的查询:
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 一起使用。 我可以做些什么来调整这个查询?谢谢...
这不是重复的,检查 cmets!
【问题讨论】:
-
当您使用 WHERE 语句数据库按您指定的字段搜索数据时。所以你可以在'x'和'y'中添加索引。
-
。 @AlexSlipknot 如果我想完全避免表扫描,您能否展示一下索引的外观?比如,我应该按什么顺序放置 x、y、id、占用列等,以便优化器有效地使用它?
-
@MetalCastles -
INDEX(x,y,id)--id没有添加任何有用的东西。拥有所有列(因此“覆盖”)可能是好的。然而,正如 SolarBear 指出的那样,“批量可能会减慢速度”。
标签: mysql sql performance indexing