【问题标题】:MySQL/RDBMS: Is it okay to index long strings? Will it do the job?MySQL/RDBMS:索引长字符串可以吗?它会完成这项工作吗?
【发布时间】:2013-03-12 11:47:20
【问题描述】:

假设我有一张电影表:

+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| title      | tinytext            | YES  |     | NULL    |                |
| synopsis   | synopsis            | YES  |     | NULL    |                |
| year       | int(4)              | YES  |     | NULL    |                |
| ISBN       | varchar(13)         | YES  |     | NULL    |                |
| category   | tinytext            | YES  |     | NULL    |                |
| author     | tinytext            | YES  |     | NULL    |                |
| theme      | tinytext            | YES  |     | NULL    |                |
| edition    | int(2)              | YES  |     | NULL    |                |
| search     | text                | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+

在本例中,我使用search 列作为表的摘要。因此,可能的记录如下:

+------------+-------------------------------------------------------------+
| Field      | Value                                                       |
+------------+-------------------------------------------------------------+
| id         | 1                                                           |
| title      | Awesome Book                                                |
| synopsis   | This is a cool book with a cool history                     |
| year       | 2013                                                        |
| ISBN       | 1234567890123                                               |
| category   | Horror                                                      |
| author     | John Doe                                                    |
| theme      | Programmer goes insane                                      |
| edition    | 2nd                                                         |                        
| search     | 2013 horror john doe awesome book this is a cool book (...) |
+------------+---------------------+------+-----+---------+----------------+

此列search 将在进行搜索时被扫描。请注意,它包含其他字段的所有单词,小写,可能还有一些额外的单词来帮助搜索。

我有两个问题:

1) 知道此列是一个文本字段并且可以变得非常大,是否可以对其进行索引?它会按预期提高性能吗?为什么?

2) 尽管有索引,但使用此方法进行搜索是一个好主意,还是最好尝试查询查询中的每一列?我该如何改进它?

OBS:我并没有这个表,只是为了举例。请忽略我可能所做的数据类型或语法中的任何错误。

【问题讨论】:

  • 索引条目在 MySQL 中是有限的(我认为是 8k 之类的),如果插入的值太大而无法索引,您可能会收到错误。为什么不使用全文搜索?

标签: mysql database performance search indexing


【解决方案1】:

1) 知道此列是一个文本字段并且可以变得非常大,是 可以索引吗?它会按预期提高性能吗?为什么?

是的,您可以索引它,但不,它不会提高性能。仅当查询与列的开头匹配时,字符串类型列上的索引才有帮助 - 因此在您的情况下,搜索“2013 Horror john”的人会点击索引,但搜索“horror john 2013”​​的人不会。

2) 尽管有索引,使用这种方法搜索是不是一个好主意 还是在我的查询中尝试每一列更好?我该如何改进它?

正如 Gordon Linoff 所写,最好的解决方案可能是 full text searching - 这对于文本搜索来说非常快,处理“模糊”匹配,并且通常允许您编写类似于 google 工作方式的搜索功能。

【讨论】:

    【解决方案2】:

    索引search 列没有帮助。

    您可能想要的是专栏上的全文搜索功能,您可以阅读有关here 的信息。

    您用于搜索的内容取决于搜索是否使用上下文。如果有人搜索“Clinton”,您是否希望他们将搜索限制为“Clinton”作者或有关“Clinton”的书籍?如果你不关心上下文,那么一个字段的全文是相当合理的。

    我需要补充一点:您无需将所有搜索词放在单独的字段中即可使用全文搜索。您可以在多个列上创建全文索引。这使您可以灵活地使用带有上下文的全文搜索(通过仅查看特定列)或不使用上下文(通过查看所有列)。您的问题特别是关于 search 列,但这不是实现您正在寻找的功能的最佳方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2016-07-11
      • 2012-02-17
      • 2020-11-25
      • 2011-07-23
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多