10月
17
MySQL优化小技巧
文章分类:MySQL 查看次数:275 + 78
原文地址:click here
以下为译文
最近经常看到有人讨论MySQL的优化,可以理解,其实他们都没有尝试过在海量数据下,哪些因素会成为瓶颈。一些简单的建议 我不认为自己是专家,但我有在大数据量下工作的经验,以及自己总结的关于查询的优化。通过使用EXPLAIN来优化查询EXPLAIN 是你的朋友,你应该去了解她。如果你花时间去了解EXPLAIN的说明文档 的话,会发现许多有价值的东西,部分显示如下。
优化 JOIN
MySQL是通过但扫描多连接的方式来处理JOIN的,也就是说,MySQL首先从第一个表获取所有的行,然后从第二个表中查找匹配数据,接着是第三个,以此类推。当所有的表都被处理后,MySQL输出所选择的列然后撤出该表。
为什么这很重要?假设一个表(tableA)有8000条数据,这个表有一个对应的n:n的表(locations),存储的是tableA的location,可以这么来写这个查询
LEFT JOIN tableA2locations ON
tableA2locations.tableA_id = tableA.id
LEFT JOIN locations ON
tableA2locations.location_id = locations.id
WHERE locations.location = 'sometown'
对这个查询语句留个印象。MySQL会首先从第一个表获取记录,然后从join table中筛选出符合的数据,以此类推。这将带领我们进入下一个话题
执行一个查询所需要的行数
通过观察EXPLAIN的输出可以对这个查询语句的优劣有一个大致的判断。她能够告诉你有多少条数据MySQL必须检测。
通过上面这个例子可以看出,如果一个表没有索引,那么在处理一个普通的3表查询(1000x1000x1000)时,一个join语句就有可能变得很慢。可以参考这篇文章
减少一个查询语句里面的行数
仍然拿上面那个例子来看,我们通过多一个where条件,来使得查询的行数减半(tableA.foo = 'bar')。
LEFT JOIN tableA2locations ON
tableA2locations.tableA_id = tableA.id
LEFT JOIN locations ON
tableA2locations.location_id = locations.id
WHERE locations.location = 'sometown' AND tableA.foo = 'bar'
这样我们只需从tableA的4万条数据开始查询。如果tableA2locations还有2千条数据的话,总共是80,000(我不知道怎么来的)条数据。情况有些好转,但如果有3个表或者更多呢?答案应该是首先查询数量最少的表
LEFT JOIN tableA2locations ON
tableA2locations.location_id = locations.id
LEFT JOIN tableA ON
tableA2locations.tableA_id = tableA.id
WHERE locations.location = 'sometown' AND tableA.foo = 'bar'
如果tableA2locations和tableA都有做索引的话,那么查询将是相当快的。
最初我编程的时候,我总是先选择主表然后关联其他的表。但是当你添加一些数据后并开始使用EXPLAIN时,你会发现首先select行数最少的表是最佳选择。
如果想更深入地了解这个话题,可以到HackMySQL去看看。
相关文章
评论
发表评论
