【问题标题】:Optimize Select Query from a table with Millions Rows从具有数百万行的表中优化选择查询
【发布时间】:2011-01-14 20:40:52
【问题描述】:

我正在使用 Wordpress 自托管 CMS 开发网站。

在其中一个页面中,我运行了一个对 wordpress 数据库进行查询的函数,以检查帖子是否已经发布,我正在比较标题以检查它。

这是我的查询:

$wpdb->get_row("SELECT id FROM wp_posts WHERE post_title = '" . $title . "'", 'ARRAY_A');

所以我正在检查是否发布了$title,但我担心如果帖子数量增加,比如说100万个帖子,我担心它会很慢..

关于如何使这个查询更快的任何建议?我听说过 CREATE INDEX 和 mysql 缓存,但我不明白如何实现它。任何解释和参考建议将不胜感激。

【问题讨论】:

  • 哇,wordpress 博客上有一百万篇文章?您必须制定一些大型博客计划。
  • 好吧,您可以将自己托管的 wordpress 变成多种类型的网站,不仅是博客,例如一个接近博客但确实有很多帖子的网站是一个新闻网站。是的,也许我最好在没有 CMS 的情况下构建它以获得最大的灵活性:D

标签: php mysql wordpress


【解决方案1】:

试试这个:

CREATE INDEX IX_wp_posts_post_title ON wp_posts (post_title)

索引的创建需要很长时间,但之后您的查询应该接近即时。

【讨论】:

  • 感谢 Mark,一旦我创建了索引,在 CREATE INDEX 进程之后插入的任何新行都会自动拥有索引吗?
【解决方案2】:

根据查询数据时使用的最常用列在表上创建索引,例如在此处查找 post_title。

此外,由于您像现在一样动态构建 SQL-Select 语句,因此您对 SQL-Injection 攻击非常开放,应该转义字符串,最好使用参数化查询调用。

【讨论】:

  • 感谢 DRapp,我将阅读有关参数化查询的信息,并修复我的代码。
【解决方案3】:

不太确定您要在这里实现什么。有两个标题相同的帖子似乎不是世界末日。

更令人担忧的是,您的代码完全可以通过 sql 注入。阅读并使用参数化查询。

创建索引很容易。

在 mytable(列名)上创建索引 myindex;

这将有助于选择...但如果您确实有 数百万 行,则最好获得一些适当的数据库建议 - 您可能需要对数据进行分区。

【讨论】:

    【解决方案4】:

    如果您要检查特定帖子是否已经在您的数据库中,您应该使用帖子的 id 而不是其标题来测试。一是因为它是一个保证的唯一标识符(假设它是主键),二是因为查询将能够更快地搜索它。

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2021-09-24
      • 2023-01-05
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多