如何提高MySQL查询时间

如何提高MySQL查询时间,mysql,google-cloud-sql,Mysql,Google Cloud Sql,我正在使用Google SQL Cloud(MySQL 5.5 w/4GB ram)合并两个数据集,每个数据集有约100万行,运行时间超过5小时。我从Sequel Pro运行以下查询: create table newtable as (select * from table1 t1 left join table2 t2 using (key)) 每个表大约有20个VARCHAR列。Key也是一个VARCHAR 我已经在两个表中的键上创建了一个索引,但这并没有真正改变性能。我搜索了很多,但找

我正在使用Google SQL Cloud(MySQL 5.5 w/4GB ram)合并两个数据集,每个数据集有约100万行,运行时间超过5小时。我从Sequel Pro运行以下查询:

create table newtable as (select * from table1 t1 left join table2 t2 using (key))
每个表大约有20个VARCHAR列。Key也是一个VARCHAR

我已经在两个表中的键上创建了一个索引,但这并没有真正改变性能。我搜索了很多,但找不到任何关于如何缩短查询时间的直接建议。这是MySQL的预期查询时间吗


编辑:每个表都是~250MB

虽然听起来很傻,但您可能会更幸运地使用mysqldump导出表,更改表名,然后重新导入它。

我注意到的第一件事是您的键被设置为VARCHAR。这可能是导致您的性能不佳的主要原因。这可以通过添加自动递增的整数主键来改进。由于“表1”中百万键值的每个字符串都要单独与“表2”中百万键值的每个字符串进行比较,因此这是一项非常高性能的任务,通过比较每个字符串中的每个字符更是如此。由于使用整数是一种简单的值对值比较,因此其影响要小得多


由于实例上的物理硬件限制,云SQl实例的层大小也会对性能产生很大影响。您可以临时更改实例的层,以便在云SQL用户界面的“编辑”部分对其进行测试,或者使用。

这~1M行代表多少数据?必须包括将原始表中的所有数据物理复制到新表中的时间。这不是通过摆弄sql语法可以优化的。这是存储系统的限制。您可以创建表中所有列的索引。这样,mysql就不必从表的数据文件中获取信息。当然,索引将是巨大的,需要一段时间才能添加到表中。但也许没关系。我不完全理解您的全部要求。我猜varchar键不是集群键?它们是设置为主键还是其他类型的约束?请向我们显示您的联接查询。我相信原始语句将导致使用临时表创建表,而执行导出和导入时仅使用非临时表。临时表的性能可能会更差,因此这可能会消除瓶颈。感谢您的解释:)