我有两张桌子,
第一个表存储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应用程序,没有任何搜索辅助索引程序。
有什么建议可以加快速度吗?
答案 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 ....
插入它