什么是更快的搜索mysql:表有一列或许多较小的列

时间:2015-02-20 17:41:47

标签: mysql search

我正在尝试构建一个表,用于搜索来自许多不同表的合并数据。所有列都是字符串。我不确定什么是更快的方式:

  1. 将所有字符串合并为一列(每个字符串用|分隔) 喜欢" 94045 |山景| blah | ..."
  2. 使用多个String列创建表。
  3. 我打算做" LIKE"搜索。例如"从SEARCH中选择ID,其中col1喜欢'%查看%'"

    两种方法的搜索速度有什么不同吗?

3 个答案:

答案 0 :(得分:1)

如果每个单独的单词具有不同的含义,则分隔的列应该更好。 例如,如果您的数据来自:邮政编码,街道和描述,那么您应该有3个不同的列。

这样,如果您知道搜索字词只应位于其中一个字段中,则可以构建搜索以仅查看某些字段。

答案 1 :(得分:1)

如果搜索模式在第一个字符之前有通配符,则无法有效地为快速搜索索引数据,因此需要进行“完整数据扫描”。

您可以通过减少扫描的记录数量来大大提高性能。就像检查数据一样挑选邮政编码并对其进行索引搜索(结合疯狂LIKE条件)。

答案 2 :(得分:1)

我假设id是您的主键,并且您正在使用InnoDB。

如果组合字符串小于InnoDB单列索引限制767字节,则将字符串组合成一列,以便MySQL可以扫描单个扁平索引。然后,在该单个列上创建二级索引。

由于前缀中的通配符,MySQL仍然必须扫描索引而不是进行二进制搜索来定位ID,但扫描索引比扫描更大的数据页更快。

此外,如果有足够的工作空间(innodb_buffer_pool_size),MySQL将在内存中包含索引,因此根本不需要访问磁盘。

SELECT id FROM table1
WHERE column1 LIKE '%search%'

请注意,单列索引在此处充当覆盖索引,因为InnoDB二级索引也始终具有主键。因此,仅选择id,主键与二级索引相比,将其视为覆盖索引。