我有一个数据库,我按地理位置列出事件(目前数据库中有大约100000个事件)。目前,它处于一个很好的规范化模式中:表tevent
中的一个事件有一个外键fkvenue
,它指向表tvenue
中具有外键fkcity
的地点。 ,依此类推tregion
和tcountry
。
查找事件最多的国家的查询相当复杂,内部联接不少于三个:
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
令我惊讶的是,这产生了完全相反的效果:新查询花费的时间几乎是旧的,更复杂的查询的五倍。
有人可以解释一下这个问题,还是指出一个很好的资源来帮助我了解多表查询的速度?或者甚至告诉我这种事情的首选模式?
(在任何人问之前,我已经注意在运行之间做一个“重置查询缓存”,以使计时结果有效,是的,我已正确索引所有内容!!!!)
由于
大卫
答案 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