如何优化此MySQL查询以执行fastar?

时间:2014-01-26 08:35:53

标签: mysql sql optimization left-join

这是我的查询

SELECT * FROM ".TB_PREFIX."wdata 
left JOIN ".TB_PREFIX."vdata 
ON ".TB_PREFIX."vdata.wref = ".TB_PREFIX."wdata.id 
where ".TB_PREFIX."wdata.id = $id

这是慢查询的结果:

  

Query_time:0.005000 Lock_time:0.000000 Rows_sent:1 Rows_examined:21184

如何优化此代码以更快地执行?

编辑:

表格结构:

CREATE TABLE IF NOT EXISTS `tss1_wdata` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `fieldtype` tinyint(2) unsigned NOT NULL,
  `oasistype` tinyint(2) unsigned NOT NULL,
  `x` smallint(3) NOT NULL,
  `y` smallint(3) NOT NULL,
  `occupied` tinyint(1) NOT NULL,
  `image` char(3) COLLATE utf8_persian_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=40402 ;


CREATE TABLE IF NOT EXISTS `tss1_vdata` (
  `wref` int(11) unsigned NOT NULL,
  `owner` int(11) unsigned NOT NULL,
  `name` char(100) COLLATE utf8_persian_ci NOT NULL,
  `capital` tinyint(1) unsigned NOT NULL,
  `pop` mediumint(11) unsigned NOT NULL,
  `cp` mediumint(11) unsigned NOT NULL,
  `celebration` int(11) NOT NULL DEFAULT '0',
  `type` int(11) NOT NULL DEFAULT '0',
  `wood` float(12,2) NOT NULL,
  `clay` float(12,2) NOT NULL,
  `iron` float(12,2) NOT NULL,
  `maxstore` int(11) unsigned NOT NULL,
  `crop` float(12,2) NOT NULL,
  `maxcrop` int(11) unsigned NOT NULL,
  `lastupdate` int(11) unsigned NOT NULL,
  `loyalty` tinyint(3) NOT NULL DEFAULT '100',
  `exp1` int(11) NOT NULL,
  `exp2` int(11) NOT NULL,
  `exp3` int(11) NOT NULL,
  `created` int(11) NOT NULL,
  `natar` tinyint(1) unsigned NOT NULL,
  `starv` int(11) unsigned NOT NULL,
  `starvupdate` int(11) unsigned NOT NULL,
  PRIMARY KEY (`wref`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

3 个答案:

答案 0 :(得分:0)

看起来你拥有所有必要的索引,并且查询本身构建得恰到好处,即SQL中没有任何改进。实际上,我不认为5ms查询是一个慢的

如果关键查询每秒执行数千次,您仍然可以在应用程序级别缓存结果或检查NoSQL解决方案。我个人会先尝试缓存它。

答案 1 :(得分:0)

您正在寻找特定的ID,因此您可以将结果限制为1行。此外,您可以将wdata.id替换为ON语句中的实际ID。

SELECT * FROM ".TB_PREFIX."wdata
LEFT JOIN ".TB_PREFIX."vdata
ON ".TB_PREFIX."vdata.wref = '$id'
WHERE ".TB_PREFIX."wdata.id = '$id'
LIMIT 1

你有正确的指数,所以没有什么可以做的。

答案 2 :(得分:-1)

尽量避免使用JOIN表,使用简短查询(单个)并将结果存储在php数组或mysql内存中,确保mysql字段中的所有条件都正确索引。

可以参考mysqlperformanceblog.com获取更多与mysql相关的文章。