【问题标题】:database design to speed up application数据库设计以加快应用程序
【发布时间】:2014-05-03 07:19:21
【问题描述】:

我有两张桌子,

第一个表存储 URL

|link_id | link_url |

第二个表存储 user_bookmarks

|user_id| link_id | is_bookmarked |

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

问题来了,

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

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

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

【问题讨论】:

  • 您在表上创建了任何索引?我不是你可以尝试为初学者创建索引
  • 在检查索引后,对你正在使用的查询做一个解释
  • SELECT count(*) as total FROM firstTable WHERE `link_url`='www.someUrl.com/something/more/to/this' 需要多长时间?
  • @MonkeyZeus 4 秒
  • 我确实有一个link_url 的索引,用于查询来自url_table select *.. where link_url='link' 的链接的搜索时间很大

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


【解决方案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 表中添加新条目时加速插入查询可以通过适当的索引来加速。

【讨论】:

  • 在问题中没有提到它,但是user_bookmarks 有更多的列,例如is_visited 等。而且count() 不是一个昂贵的操作吗?
  • @wolfgang 您可以评估一些 NoSQL 解决方案,但您的问题太笼统了,它适用于任何数据库技术。只有当您没有适当的索引时,计数才会昂贵。
【解决方案2】:

如果您告诉我们您当前的架构是什么(即包括索引的创建表语句),而不仅仅是您的列名,那么我们可能会就如何改进它提出实用的建议。

添加行的方法当然还有改进的余地:

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

【讨论】:

  • link_id 是自动递增的,使用 md5 哈希作为 link_id 上的唯一索引如何表现更好?
  • 它省略了到数据库的 2 次往返,并且索引直接从 url 派生,因此使用 URL 的查询可以使用索引。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 2018-01-31
  • 2015-11-03
  • 2014-03-07
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多