使用多个JOIN优化数据库

时间:2011-07-22 01:28:14

标签: mysql sql database database-design

首先,关于网站和数据库结构的一些细节 -

通过我的网站,您可以学习英语单词,并且您可以在每个单词上插入句子,关联,图像,此外 - 每个单词都有一个类别,子类别,组...

我的数据库包含大约20个表。注册到我网站的任何用户'添加'到用户表格就像4000行 - 我网站上的单词数量。当用户过滤单词时出现严重问题(类似于'搜索'单词但是根据char / s& category / s& group / s等等。我的sql查询中有9个JOIN,它需要类似的东西1分钟显示结果..

JOIN的目标 - 在表用户(每个用户有4000行/每行=单词)内有这种风格的连接:

$this->db->join('users', 'sentences.id = users.sentence_id' ,'left');

与关联,群体,图像,单词之间的绑定等相同的事情。 users表包含句子,关联,组的ID ...和JOIN有连接。

我不知道该怎么做..这需要太多时间。也许问题是数据库的结构?多个连接?也许使用索引?怎么去哪里?因为有时必须检索所有单词,所以索引不会有帮助。

我正在使用MySQL。

2 个答案:

答案 0 :(得分:1)

首先,如果您正在使用那么多连接,索引将无法保存您(因为它们在大多数情况下不会在连接中使用)。

你可以做一些事情。

架构设计

如果您需要9个联接来实现您的目标,您可能需要重新考虑您的架构设计/查询!

从它的外观来看,你的桌子似乎非常规范化,也许是第三种正常形式?在这种情况下,考虑将表非规范化为较大的表以避免连接(连接比全表扫描更昂贵!)。有许多关于此的在线文档,但总是有成本,因为它增加了开发复杂性和数据冗余。此外,通过对表进行非规范化,可以避免连接,并且可以更好地使用索引。

另外我相信MyISAM是MySQL中唯一支持FULL TEXT索引的存储引擎。但是它没有事务并且没有表级锁定且没有MVCC,所以它取决于你需要的东西。

<强>资源

我建议您阅读本书High Performance MySQL。 关于调优MySQL数据库的一本非常棒的书

我还建议您阅读所选存储引擎的官方文档。这很重要,因为每个存储引擎非常不同! InnoDB与MyISAM完全不同,MyISAM也与PBXT完全不同。每个引擎都有它的好处,你必须考虑哪一个适合你的情况。

答案 1 :(得分:0)

我会绘制关系模式并计算出正在运行的查询的操作数,然后从那里开始。大多数DBMS都试图隐式地优化查询,但并不总是最优化。您应该考虑重新排序连接,以便首先执行最严格的连接。索引可能有所帮助,并且需要进行一些分析才能找到您正在搜索的属性。

建立数据库以处理自然语言是一个非常具有挑战性的主题,并且有很多关于该主题的研究。你看过马尔可夫链吗?您是否退后一步并考虑了您尝试做的计算复杂性?如果你得到九个连接的相同结论,那么可以公平地说这个问题对于实时应用来说不够可扩展。

顺便说一下,我相信Google App Engine的数据存储会尝试为您提供索引属性,具有隐式可伸缩性。如果您在小型Web服务器上运行数据库,那么您可能会看到使用更全面的DBMS部署它的更好结果。不过,我只会将此视为最后的手段。