Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化此MySQL查询以执行fastar?_Mysql_Sql_Optimization_Left Join - Fatal编程技术网

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

如何优化此MySQL查询以执行fastar?,mysql,sql,optimization,left-join,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 这是缓慢查询的结果: 查询时间:0.005000锁定时间:0.000000行发送:1行检查:21184 如何优化此代码以更快地执行 编辑: 表结构: CREATE TABLE IF N

这是我的问题

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
这是缓慢查询的结果:

查询时间:0.005000锁定时间:0.000000行发送:1行检查: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;

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


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

看起来您已经拥有了所有必要的索引,并且查询本身构建得恰到好处,也就是说,SQL中没有什么需要改进的地方。实际上,我不认为5ms查询是一个缓慢的< /P>
若它是每秒执行数千次的关键查询,那个么您仍然可以在应用程序级别缓存结果或检查NoSQL解决方案。我个人会先尝试缓存它。

您正在查找特定的ID,因此可以将结果限制为1行。此外,还可以在ON语句中用实际id替换wdata.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

您有正确的索引,因此无需执行任何操作。

请为Wdata和vdata@Marat我把它添加到我的postQuery时间的一部分:0.005000慢吗???它非常快:)@echo\u Me:是的,但我有大约24个这样的查询,当用户越来越高时,它会变得很慢,对吗?我认为你的查询非常快,如果你有24个查询,那么你的问题在于管理或处理它们,而不是查询本身。或者你的脚本是slow.tnx用于回复,是否有任何提示或优化我的查询?如果当前查询得到优化,我将不胜感激,因为我的英语很差,“尽量避免加入”-这就是DBMS构建的目的。连接并不一定会使查询变慢。@Benjaminfox实际上优化不仅限于mysql查询,还包括数据库和系统I/O。通常我会先在服务器上进行I/O性能或带宽测试(SSD很好),然后使用sysbench进行mysql性能调优,然后设计表结构,然后只查询。谢谢各位,我使用了您编辑的查询,结果比原始查询要好得多。。所以查询是正确的和优化的,对吗?因此,我必须为表编制索引以获得更好的性能?@Benjaminfox注意,没有ORDER BY的LIMIT几乎毫无意义。事实上,这不是因为在引擎找到1个条目后,如果使用
LIMIT 1
,它将停止查找。表具有正确的索引,因此您无法再以这种方式优化查询。我想你的查询已经很快了。任何进一步的优化似乎都是过早的。非常感谢您的回答,我有一个问题,我知道缓存查询的一种方法。它的apache模块。有没有最好的方法和简单的方法来缓存查询?tnx ALOTCACH意味着您只需将SQL查询结果存储在更快的存储中,例如memcached php.net/manual/en/book.memcache.php