2017-03-01 164 views
0

我有简单的MySQL查询,其运行速度非常慢。优化Mysql查询,

INSERT INTO People_by_County (City, County, State, score, Month_, person_id) 
SELECT people.City, people.County, people.State, PPL_month.score, PPL_month.Month_, PPL_month.person_id 
FROM PPL_month 
INNER JOIN people ON PPL_month.person_id = people.person_id 

人表中的700K行和PPL_month表中的2,9Mln行。问题是,在我对不同的表执行类似查询之前,在一个表上,另一个400Mln上有700K行,查询在6小时内完成。而且这个运行了将近24小时。任何想法为什么这么慢?当时没有其他查询正在运行,因此没有人正在使用RAM。

波纹你可以看到查询的解释。

enter image description here

+0

“people”表中'person_id'列是否有索引? –

+0

你能否提供有关表格结构的信息?你有索引吗?你是否使用MySQL EXPLAIN函数试图了解查询的内容? –

+0

发布结构,索引,并运行它与解释(只是选择部分)并发布结果 –

回答

1

首先创建INDEXPERSON表以及PPL_Month table.Then尝试执行此查询

SELECT people.City, people.County, people.State, PPL_month.score, PPL_month.Month_, PPL_month.person_id 
FROM PPL_month 
INNER JOIN people ON PPL_month.person_id = people.person_id 

多少时间了执行?记下时间,并记下执行对同一个查询进行计时而不在两个表上创建索引。 你一定会得到更多的时间。 所以间接表示要插入的数据更多地取决于它被提取的速度。因此,一旦抓取速度很快,插入速度比前一次更快。

希望这会有所帮助。

+0

它像一个魅力工作。谢谢。但是,你能帮我理解这个过程吗?我认为,为了索引,你必须只有唯一的值,我在People表中有,但不是在PPL_month(有多个相同的person_id)。索引如何在此表上工作?它忽略了所有其他相同的值吗? – Extria

+0

@Extria如果您没有特定表的唯一值,那么您可以使用组合两列或更多列来实现唯一性,这完全取决于您的执行计划。因此,建议始终使用Explain来检查您的查询执行情况,然后只能继续在多列的组合上创建索引。 Syntex同样是 '在表名(column1,column2)上创建索引idx;'。 有关进一步的说明或讨论,请查看:http://mysql.rjweb.org/doc.php/index_cookbook_mysql –