如何使復雜/長期運行的SQL查詢更高效?

我創建了一個從多個表中檢索數據的查詢。當我運行它時,大約需要200秒才能執行。我現在正試圖提高查詢效率,但我已經達到極限,無法找到解決方案。你知道我該如何改進下面的查詢嗎?

SELECT s1.otherdeed_id, s1.timestamp_start, s1.listingprice, s1.listing_currency, otherdeed_index.category, otherdeed_index.koda_id, kodas.mega, otherdeed_index.artifact_name, otherdeed_index.sediment
FROM otherdeed_opensea_listings s1
JOIN (
  SELECT otherdeed_id, listingprice, MAX(timestamp_start) AS timestamp_start
  FROM otherdeed_opensea_listings
  GROUP BY otherdeed_id) AS s2
  ON s1.otherdeed_id = s2.otherdeed_id AND s1.timestamp_start = s2.timestamp_start
INNER JOIN otherdeed_index ON otherdeed_index.id_otherdeed = s1.otherdeed_id 
INNER JOIN kodas ON otherdeed_index.koda_id = kodas.kodaname
ORDER BY otherdeed_id;

該查詢應提供otherdeed_opensea_listings表(16k個條目)的最新上市價格列表,并將其與表otherdeed_index(100k條條目)和kodas(10k條條目)連接,以獲得一些相關數據進行分析。

我將otherdeed_opensea_listings表分組,以便彼此只得到一個結果,此外,僅獲得具有最高timestamp_start值的最新結果也是相關的。

下面可以看到我的sql結構:

CREATE TABLE `kodas` (
 `kodaid` int(11) NOT NULL AUTO_INCREMENT,
 `kodaname` int(11) NOT NULL,
 `image` varchar(255) NOT NULL,
 `mega` tinyint(1) NOT NULL,
 `clothing` varchar(100) NOT NULL,
 `core` varchar(100) NOT NULL,
 `eyes` varchar(100) NOT NULL,
 `head` varchar(100) NOT NULL,
 `weapon` varchar(100) NOT NULL,
 PRIMARY KEY (`kodaid`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8

CREATE TABLE `otherdeed_index` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_otherdeed` int(11) NOT NULL,
 `plot` int(11) NOT NULL,
 `image` varchar(200) NOT NULL,
 `category` varchar(20) NOT NULL,
 `sediment` varchar(40) NOT NULL,
 `sediment_tier` tinyint(1) NOT NULL,
 `environment` varchar(50) NOT NULL,
 `environment_tier` tinyint(1) NOT NULL,
 `artifact_name` varchar(80) NOT NULL,
 `r_east` varchar(20) NOT NULL,
 `r_west` varchar(20) NOT NULL,
 `r_south` varchar(20) NOT NULL,
 `r_north` varchar(20) NOT NULL,
 `r_east_tier` tinyint(1) NOT NULL,
 `r_west_tier` tinyint(1) NOT NULL,
 `r_south_tier` tinyint(1) NOT NULL,
 `r_north_tier` tinyint(1) NOT NULL,
 `koda_id` int(6) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=115001 DEFAULT CHARSET=utf8

CREATE TABLE `otherdeed_opensea_listings` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `eventid` bigint(20) NOT NULL,
 `event_type` varchar(10) NOT NULL,
 `auction_type` varchar(10) NOT NULL,
 `otherdeed_id` int(9) NOT NULL,
 `timestamp_created` int(11) NOT NULL,
 `timestamp_start` int(11) NOT NULL,
 `timestamp_end` int(11) NOT NULL,
 `duration_active` int(11) NOT NULL,
 `listingprice` float NOT NULL,
 `listing_currency` varchar(20) NOT NULL,
 `status` tinyint(1) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=418927 DEFAULT CHARSET=utf8

我的sql查詢的輸出:(explain select)

? 最佳回答:

你肯定需要一些索引。嘗試添加以下內容:

ALTER TABLE otherdeed_opensea_listings 
ADD INDEX timestamp_start (timestamp_start),
ADD INDEX otherdeed_id (otherdeed_id);

ALTER TABLE otherdeed_index 
ADD INDEX id_otherdeed (id_otherdeed),
ADD INDEX koda_id (koda_id);

ALTER TABLE kodas 
ADD INDEX kodaname (kodaname);

這可能會給你更快的結果。這里有一個關于解釋的小測驗。

主站蜘蛛池模板: 少妇人妻精品一区二区三区| 国产福利一区二区三区视频在线| 亚洲AV无码第一区二区三区| 午夜爽爽性刺激一区二区视频| 久久免费精品一区二区| 免费视频一区二区| 无码少妇丰满熟妇一区二区| 国产精品香蕉一区二区三区| 在线视频国产一区| 亚洲第一区在线观看| 天堂va视频一区二区| 亚洲综合一区国产精品| 亚洲日韩中文字幕一区| 99精品国产高清一区二区麻豆 | 国产成人精品第一区二区| 亚洲AV无码一区二区三区在线观看| 无码av人妻一区二区三区四区| 亚洲视频一区网站| 亚洲国产综合无码一区| 精品一区二区三区3d动漫| 亚洲一区在线免费观看| 一区二区三区免费在线观看| 无码人妻精品一区二区三区66| 无码视频免费一区二三区| 成人国内精品久久久久一区| 毛片一区二区三区| 无码精品国产一区二区三区免费| 色噜噜狠狠一区二区三区| 国模私拍一区二区三区| 高清精品一区二区三区一区| 国产成人精品一区二区三区无码 | 亚洲av无码一区二区三区网站| 亚洲一区二区三区无码影院| 久久国产高清一区二区三区| 天堂资源中文最新版在线一区| 色窝窝无码一区二区三区| 国产精品主播一区二区| 国产高清视频一区三区| 成人丝袜激情一区二区| 国产AV一区二区三区无码野战| 无码人妻精品一区二区三区蜜桃|