如何选择多表结构以获得最快的查询响应

时间:2011-06-30 16:21:52

标签: mysql performance multiple-tables

我有一个数据库,我按地理位置列出事件(目前数据库中有大约100000个事件)。目前,它处于一个很好的规范化模式中:表tevent中的一个事件有一个外键fkvenue,它指向表tvenue中具有外键fkcity的地点。 ,依此类推tregiontcountry

查找事件最多的国家的查询相当复杂,内部联接不少于三个:
select r.fkcountry,count(distinct e.id) from tevent e inner join tvenue v on e.fkvenue=v.id inner join tcity cy on v.fkcity=cy.id inner join tregion r on cy.fkregion=r.id group by r.fkcountry order by count(distinct e.id) desc

我正试图找到加快速度的方法,我认为按国家/地区直接映射事件可能会有所帮助。我已经创建了一个地图表teventcountry,其结构语法更简单:
select ec.fkcountry,count(distinct e.id) from tevent e inner join teventcountry ec on ec.fkevent=e.id group by ec.fkcountry order by count(distinct e.id) desc

令我惊讶的是,这产生了完全相反的效果:新查询花费的时间几乎是旧的,更复杂的查询的五倍。

有人可以解释一下这个问题,还是指出一个很好的资源来帮助我了解多表查询的速度?或者甚至告诉我这种事情的首选模式?

(在任何人问之前,我已经注意在运行之间做一个“重置查询缓存”,以使计时结果有效,是的,我已正确索引所有内容!!!!)

由于

大卫

1 个答案:

答案 0 :(得分:0)

您需要了解MySQL如何评估查询。为此,请使用内置命令EXPLAIN,该命令描述MySQL如何执行给定的select语句。

以下是EXPLAIN的参考:http://dev.mysql.com/doc/refman/5.5/en/explain.html

您可以使用EXPLAIN的输出来查看MySQL“查询执行计划”,包括它将使用哪些索引和联接,等等。从中您可以解释给定查询快速或慢速的原因,以及您可以采取哪些措施来改进它。通常这意味着添加特定索引,或者调整一个索引,以便在查询中使用它。

你可以谷歌“MySQL EXPLAIN”获得使用这个强大工具的一系列指南。这是一个这样的演练:http://forums.spry.com/howtos/1345-using-mysqls-explain-command.html