数据库设计,以加快应用程序

时间:2014-03-25 12:32:38

标签: php mysql database-design nosql search-engine

我有两张桌子,

第一个表存储URL

|link_id | link_url |< == schema url_table :::包含200万+行

和第二个表存储user_bookmarks

|user_id| link_id | is_bookmarked |< ==架构for user_table :::超过350万+行

is_bookmarked存储1或0,根据用户是否加入书签的链接。

这是问题,

添加新链接时,这些是以下步骤 1)检查url_table中是否已存在url,这意味着要经历数百万行 2)如果不存在,则在url_table和user_table

中添加一个新行

由于存在巨大的行集,数据库(Mysql)只是花费了太多时间 此外,它是一个非常简单的PHP + Mysql应用程序,没有任何搜索辅助索引程序。

有什么建议可以加快速度吗?

2 个答案:

答案 0 :(得分:1)

为什么不删除列user_bookmarks.is_bookmarked并使用带有user_id和link_id的条目的唯一存在作为链接被加入书签的指示符?

新的链接在user_bookmarks表中没有条目,因为还没有为它添加书签。当用户为链接添加书签时,您可以添加条目。当用户删除书签时,您将删除该行。

要检查用户是否为链接添加了书签,只需SELECT count() FROM user_bookmarks WHERE user_id=? AND link_id=?。当您收到1行时,会将其添加为书签。当你收到0行时,它就不是。

在URL表中添加新条目时加速插入查询可以使用适当的索引加速。

答案 1 :(得分:0)

如果你告诉我们你的模式是什么(即创建表语句包括索引)而不仅仅是你的列名,那么我们就可以就如何改进它来提出切实可行的建议。

当然可以改进添加行的方法:

假设link_url可能大于Innodb表的767字节限制(您没有说明您使用的引擎),则更改id列以包含具有唯一索引的link_url的md5哈希。然后,当您想要添加记录时,请继续尝试使用INSERT IGNORE ....

插入它