2010-08-18 59 views
0

我有mysql数据库,其中一个表有700万条记录,表需要优化,我有点犹豫是要添加索引,因为这将需要很多时间来添加700万条记录。我一直在慢查询日志中获取此表查询,沿着查询以乐观的方式编写。表数据增加 - 查询很慢

什么是最好的方法来处理这个问题,以便表查询不会出现缓慢的查询?

+0

同意......什么类型的查询,显然是到永远(很慢)这是你最大的问题......很多人在这里可能是能够以您可能没有考虑过的其他优化技术的方式提供帮助 – DRapp 2010-08-18 23:47:13

+0

中删除where column1 in(select1 from ); 假设table1有700万条带有主键的记录。 表2有50K记录的合适索引。 – Sharpeye500 2010-08-19 00:30:24

回答

0

从table1中删除where column1 in(从table2中选择column1);不是最优的。

尝试

delete table1 t1 
from table1 t1 
inner join table2 t2 on t2.column1 = t1.column1 
where conditions=true; 

我相信应该有更好的表现

+0

谢谢,为什么我们在相同的查询中使用两次表t1? – Sharpeye500 2010-08-19 17:59:00

+0

从这里检查多表语法:http://dev.mysql.com/doc/refman/5.0/en/delete.html – ceteras 2010-08-19 22:36:33

0

没有你的代码,没有确切的帮助。索引是要走的路,需要一点时间,但只有一次。它确实增加了插入的开销,但这是增加查询效率的代价。

0

您需要创建一个索引。不完全是。也许甚至不止一个。

对7百万行的查询没有索引将会变慢。你可以拆分表格或为缓存分配大量的内存,但是索引会让你获得更大的压力。

您可能会问,您应该创建哪个索引?好问题。这取决于您对该表运行的特定查询。表格设计由您的数据决定,但优化由您的查询决定。

学会使用EXPLAIN。请参阅Explain Demystified

了解索引如何工作。见More Mastering the Art of Indexing


回复您的评论:是的,主键隐含有一个索引(至少在MySQL的),但我不知道如果查询你需要提高从该指数的好处。

这里有一个提示:当我想在一个非常大的表上尝试索引时,我从一个子集的行中创建一个副本表。

mysql> create table test.mytable as select * from realdb.mytable limit 10000; 
mysql> use test; 

把一些不重要的行放入表中,但是处理它的数量不会太长。

现在您可以创建和删除索引并测试查询以了解它们的执行方式。一旦确定了能够给您带来最大收益的索引或索引,您可以更放心地在真实数据库上创建它们是值得的。

+0

我确实有主键,我犹豫添加另一个索引的原因是它将锁定表并且值得这样做,或者我们可以采取任何其他方式来实现,不会影响/产生等待时间。 – Sharpeye500 2010-08-19 00:31:41