我正在尝试构建一个表,用于搜索来自许多不同表的合并数据。所有列都是字符串。我不确定什么是更快的方式:
我打算做" LIKE"搜索。例如"从SEARCH中选择ID,其中col1喜欢'%查看%'"
两种方法的搜索速度有什么不同吗?
答案 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
,主键与二级索引相比,将其视为覆盖索引。