0

假设我有一张电影表:

+------------+---------------------+------+-----+---------+----------------+
| 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    |                |
+------------+---------------------+------+-----+---------+----------------+

在此示例中,我使用searchcolumn 作为表格的摘要。因此,可能的记录如下:

+------------+-------------------------------------------------------------+
| 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:我真的没有这张表,只是为了举例。请忽略我可能所做的数据类型或语法中的任何错误。

4

2 回答 2

2

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

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

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

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

于 2013-03-22T15:12:06.387 回答
1

索引search列没有帮助。

您可能想要的是该列上的全文搜索功能,您可以在此处阅读。

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

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

于 2013-03-22T14:59:38.827 回答