簡體   English   中英

如何優化此MySQL查詢以執行Fastar?

[英]How can I optimize this MySQL query to execute fastar?

這是我的查詢

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;

看起來您具有所有必要的索引,並且查詢本身構建得恰到好處,即SQL上沒有任何改進。 實際上,我不會將5ms查詢視為慢速查詢

如果關鍵查詢每秒執行數千次,您仍然可以在應用程序級別緩存結果或檢查NoSQL解決方案。 我個人會先嘗試將其緩存。

您正在尋找一個特定的ID,因此您可以將結果限制為1行。 另外,您可以在ON語句中將wdata.id替換為實際的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

您擁有正確的索引,因此無需執行任何操作。

盡量避免使用JOIN表,使用簡短的查詢(單個)並將結果存儲在php數組或mysql內存中,確保mysql字段中的所有條件均已正確索引。

可以參考mysqlperformanceblog.com以獲得更多與mysql相關的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM