【问题标题】:Most efficient way of MySQL rows? [closed]MySQL行的最有效方式? [关闭]
【发布时间】:2015-05-05 14:16:35
【问题描述】:

我对 MySQL 知之甚少。现在我有一个包含近 1,000,000 个条目的表,我希望在特定列中搜索特定字符串并返回这些列。

我看过LIKE,但对于如此庞大的条目,我读起来很慢。我听说全文索引是一个更好的搜索选择。

我使用 phpMyAdmin 来查看我的 MySQL 数据库。我不知道我需要对我的表进行哪些确切的修改以及之后应该使用的功能?

PS:另外,是否可以像LIKE那样与AGAINST进行模式匹配

【问题讨论】:

  • “我对 MySQL 知之甚少。现在我有一个包含近 1,000,000 个条目的表” - 那么为什么要承担像一百万行这么大的项目呢?当您几乎不知道如何游泳时,有点难以跳入深水区;-)
  • 一百万大吗?
  • 好的一百万零一个;现在这更大了 ;-)
  • 您能否提供一些细节以及您目前拥有的情况?
  • 我正在使用以下查询:w3schools.com/sql/sql_like.asp@MatteoSp 好的,让它变成 10 M :)

标签: php mysql phpmyadmin full-text-search sql-like


【解决方案1】:

您可以使用 FULLTEXT 索引来加快搜索表的速度。然而,它有一些限制——它只适用于 MyISAM 表(除非你使用 MySQL 5.6.4 or newer),你需要在你想要一次搜索的所有列上指定它,你只能搜索更长的词超过全局设置为整个数据库服务器的限制(默认为 4 个字符)

要么使用 PhpMyAdmin 创建索引,要么手动创建,语法相当简单:

ALTER TABLE tablename ADD FULLTEXT (column_you_want_to_search);

或更多列:

ALTER TABLE tablename ADD FULLTEXT (column1, column2, column3);

然后你可以询问数据库,哪些行包含一些单词:

SELECT * FROM tablename WHERE MATCH(column_you_want_to_search) AGAINST ('search query')
SELECT * FROM tablename WHERE MATCH(column1, column2, column3) AGAINST ('another query')

还有在“布尔模式”下搜索的选项,您可以在其中指定您想要、不想要的词或使用星号作为通配符。请参阅this MySQL reference 了解更多信息。

【讨论】:

  • 谢谢,这似乎是我要找的。知道用这个搜索一个包含 1000 万个条目的列表需要多长时间吗?
  • 正如您所指出的,说“它只适用于 MyISAM”是错误的。如果人们正在运行 MySQL 的历史版本,那就是他们的问题。毕竟 5.6.4 是在 2011 年推出的。
  • @tadman 我同意,但我认为这仍然是一个非常重要的事实。 Sai(或其他可能会在谷歌上搜索此答案的读者)可能正在运行较旧的 MySQL,他会很困惑为什么它不起作用。
  • 完全理解,尤其是在一些托管服务提供商运行古埃及人用来建造金字塔的 MySQL 版本的情况下,这种情况极其悲惨。但是,就措辞而言,您可能希望提及 MyISAM 部分作为警告,而不是第一件事。这就像说 PHP 不支持对象...除非您使用的是 PHP5。
  • @SaiKrishnaDeep 索引搜索的好处是它不像“where”子句中的标准条件那样受行数的影响。数据库服务器跟踪表中的所有单词以及可以找到该单词的行的引用,因此它不需要每次都逐行扫描 - 它只是直接进入请求的行并获取它们.除非设置错误,否则 1000 万应该不是问题。
猜你喜欢
  • 2015-05-06
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
相关资源
最近更新 更多