mysql 中的搜索速度更快:table 一列或许多更小的列

whats faster search in mysql: table with one column or many smaller columns

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

  1. 将所有字符串合并为一列(每个字符串用 | 分隔) 像“94045|山景城|废话|...”
  2. 使用多个字符串列创建 table。

我打算进行 "LIKE" 搜索。例如"select id from SEARCH where col1 like '%view%'"

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

如果每个分隔的词都有不同的意思,那么分隔栏应该更好。 例如,如果您的数据由:邮政编码、街道和描述组成,那么您应该有 3 个不同的列。

这样,如果您知道搜索字词应该只出现在其中一个字段中,您就可以将搜索构造为仅查看特定字段。

如果搜索模式在第一个字符之前有通配符,则无法有效地索引数据以进行快速搜索,因此需要 "full data scan"。

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

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

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

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

此外,如果有足够的工作空间(innodb_buffer_pool_size),MySQL将在内存中有索引,所以它根本不必打磁盘。

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

请注意,单列索引在这里充当覆盖索引,因为 InnoDB 二级索引也始终具有主键。因此,仅选择 id 主键,而不是二级索引,将其视为覆盖索引。