极慢的查询-使用Google SQL Cloud

时间:2018-11-11 00:26:45

标签: mysql spring google-cloud-platform

有什么办法可以加快速度吗?现在,它要花费令人难以置信的疯狂时间。

SELECT trades.*, trader1.user_name as trader1_name,
trader2.user_name as trader2_name FROM trades
LEFT JOIN logs_players trader1 ON trader1.user_id = trader1_account_id
LEFT JOIN logs_players trader2 ON trader2.user_id = trader2_account_id
ORDER BY time_added
LIMIT 20 OFFSET 0;

就在线搜索解决方案而言,我已经做了很多工作。甚至只是试图获取更多信息,为什么执行它需要这么长时间。

查询大约需要45秒才能完成。

创建语句:

CREATE TABLE `trades` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trader1_account_id` int(11) DEFAULT NULL,
  `trader2_account_id` int(11) DEFAULT NULL,
  `trader1_value` bigint(20) DEFAULT NULL,
  `trader2_value` bigint(20) DEFAULT NULL,
  `trader1_ip` varchar(16) DEFAULT NULL,
  `trader2_ip` varchar(16) DEFAULT NULL,
  `world` int(11) DEFAULT NULL,
  `x` int(11) DEFAULT NULL,
  `z` int(11) DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `trader1_user` varchar(12) DEFAULT NULL,
  `trader2_user` varchar(12) DEFAULT NULL,
  `time_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8


CREATE TABLE `logs_players` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `user_name` varchar(20) DEFAULT NULL,
  `world_stage` varchar(20) DEFAULT NULL,
  `world_type` varchar(20) DEFAULT NULL,
  `bank` longtext,
  `inventory` longtext,
  `equipment` longtext,
  `total_wealth` mediumtext,
  `total_play_time` mediumtext,
  `rights` int(11) DEFAULT NULL,
  `icon` int(11) DEFAULT NULL,
  `ironmode` int(11) DEFAULT NULL,
  `x` int(11) DEFAULT NULL,
  `z` int(11) DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `last_ip` varchar(16) DEFAULT NULL,
  `last_online` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `muted_until` timestamp NULL DEFAULT NULL,
  `banned_until` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:0)

我填充了一个示例数据库,每个数据库有1万行,并发现您需要一些索引:

ALTER TABLE `logs_players` ADD INDEX(`user_id`);
ALTER TABLE `trades` ADD INDEX(`time_added`);

我们需要的主要索引是user_id上的索引。将查询时间从20.1390秒更改为0.0130秒:

我们甚至可以通过在time_added上添加索引来进一步简化排序,从而进一步降低查询速度,现在我们得到了令人印象深刻的查询时间:

对索引进行一些研究!一个简单的EXPLAIN查询将显示您正在使用文件排序(这很糟糕!):

在索引之后,看起来好多了: