0

我有一个数据库,我在其中按地理位置列出事件(数据库中目前大约有 100000 个事件)。目前它处于一个很好的规范化模式中:表中的事件tevent有一个外键fkvenue,它指向表tvenue中具有外键的场所fkcity,依此类推到tregionand 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

我正在努力寻找加快速度的方法,我认为直接按国家/地区绘制事件地图可能会有所帮助。我创建了一个 map table 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

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

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

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

谢谢

大卫

4

1 回答 1

0

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

这是关于解释的参考:http: //dev.mysql.com/doc/refman/5.5/en/explain.html

您可以使用 EXPLAIN 的输出来查看 MySQL“查询执行计划”,包括它将使用哪些索引和连接等。从这里你可以解释为什么给定的查询是快或慢,以及你可以做些什么来改进它。通常这意味着添加一个特定的索引,或者调整一个索引以便它可以在您的查询中使用。

您可以在 Google 上搜索“MySQL EXPLAIN”以获取有关使用这个强大工具的大量指南。这是一个这样的演练:http ://forums.spry.com/howtos/1345-using-mysqls-explain-command.html

于 2011-06-30T19:02:13.830 回答