繁体   English   中英

如何使复杂/长时间运行的 SQL 查询更高效?

[英]How can I make a complex/long running SQL query more efficient?

我创建了一个从多个表中检索数据的查询。 当我运行它时,执行大约需要 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表进行分组,以便为​​每个otherdeedid只获取一个结果,此外,仅获取具有最高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 查询的输出:(解释选择) 在此处输入图像描述

你肯定需要一些索引。 尝试添加以下内容:

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);

这可能会给你更快的结果。 这是一个带有 explain 的小提琴测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM