【发布时间】:2016-02-16 06:35:18
【问题描述】:
我无法索引此查询:
SELECT *,
(ROUND(SQRT(
POW(LEAST(ABS(-12 - wdata.x),
ABS(401 - ABS(-12 - wdata.x))), 2) +
POW(LEAST(ABS(45 - wdata.y),
ABS(401 - ABS(45 - wdata.y))), 2)),3)
) AS distance
FROM odata
LEFT JOIN wdata ON wdata.id=odata.vref
WHERE TRUE
HAVING distance<4.9497474683058326708059105347339
ORDER BY distance
LIMIT 30
结果是:
+----+-------------+--------+--------+------------- --+---------+---------+-------------- --+--------+----------------------------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+--------+------------- --+---------+---------+-------------- --+--------+----------------------------------+ | 1 |简单 |数据 |全部 |空 |空 |空 |空 | 19118 |使用临时的;使用文件排序 | | 1 |简单 |数据 | eq_ref |初级 |初级 | 4 | mytravia_1000-14.odata.vref | 1 |空 | +----+-------------+--------+--------+------------- --+---------+---------+-------------- --+--------+----------------------------------+ 2 行(0.00 秒)我知道它显示 0.00 秒是执行时间,但这个查询会运行很多次,它显示它会减慢我的数据库,我不知道为什么!
每次我看到这个查询检查的行是 459448,所以它在某些方面对我的工作非常不利。
谁能给个建议?如何为 odata 表建立正确的索引?或者我可以使用子查询来修复它吗?
表格是:
解释 odata:
vref int(10) 无符号 NO PRI NULL 键入 tinyint(4) 无 NULL 征服 mediumint(8) 无符号 NO NULL 木浮子(12,2)无空 铁浮子(12,2)NO NULL 粘土浮子(12,2)NO NULL woodp float(12,2) 无空值 Ironp 浮点数(12,2) 无 NULL 粘土浮子(12,2)无空 maxstore mediumint(8) 无符号 NO NULL 作物浮动(12,2)NO NULL 裁剪浮动(12,2)NO NULL maxcrop mediumint(8) 无符号 NO NULL lasttrain int(10) 无符号 NO NULL lastfarmed int(10) 无符号 NO NULL lastupdated int(10) 无符号 NO NULL 忠诚 tinyint(4) NO 100 所有者 smallint(5) 无符号 NO 2 名称 char(45) NO Oasis并解释wdata:
id int(10) 无符号 NO PRI NULL auto_increment 字段类型 tinyint(3) NO NULL oasistype tinyint(3) NO NULL x smallint(5) NO MUL NULL y smallint(5) NO MUL NULL 占用 tinyint(4) NO NULL 图像 char(12) NO MUL NULL pos tinyint(3) NO MUL NULL我不得不说 wdata.id 和 odata.vref 已经被索引了!
表结构->
如果不存在 `odata` 则创建表( `vref` int(10) 无符号非空, `type` tinyint(4) NOT NULL, `conqured` mediumint(8) unsigned NOT NULL, `wood` float(12,2) NOT NULL, `iron` float(12,2) NOT NULL, `粘土`浮动(12,2)不为空, `woodp` float(12,2) NOT NULL, `ironp` float(12,2) NOT NULL, `clayp` float(12,2) 非空, `maxstore` mediumint(8) 无符号非空, `crop` float(12,2) NOT NULL, `cropp` float(12,2) NOT NULL, `maxcrop` mediumint(8) 无符号非空, `lasttrain` int(10) 无符号非空, `lastfarmed` int(10) 无符号非空, `lastupdated` int(10) 无符号非空, `loyalty` tinyint(4) NOT NULL DEFAULT '100', `owner` smallint(5) unsigned NOT NULL DEFAULT '2', `name` char(45) NOT NULL DEFAULT 'Unoccupied Oasis', 主键(`vref`) ) 引擎=InnoDB 默认字符集=utf8;而对于 wdata 是 ->
如果不存在 `wdata` 则创建表( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `fieldtype` tinyint(3) NOT NULL, `oasistype` tinyint(3) NOT NULL, `x` smallint(5) 非空, `y` smallint(5) 非空, `占用` tinyint(4) NOT NULL, `image` char(12) NOT NULL, `pos` tinyint(3) 非空, 主键(`id`), 键`x`(`x`), 键`y`(`y`), KEY `image` (`image`), 键`pos`(`pos`) ) 引擎=InnoDB 默认字符集=utf8 AUTO_INCREMENT=160802 ;最好的问候。
【问题讨论】:
标签: mysql performance indexing