我有一个非常大的 mysql 数据库,包含 35 个表。每个表的结构不同,但都有一些共同的字段。 'entity_name'
是所有表中的一个这样的公共(public)字段。它是一个 VARCHAR
字段。有些表包含数百万条记录,而有些表包含数十亿条记录。
我在所有这些表中搜索一个搜索键并提取实体名称,以及包含匹配记录的表中的一些公共(public)字段;将结果推送到一个数组,最后以 HTML 格式显示。查询非常简单:
SELECT * FROM table_name WHERE entity_name LIKE '%search_key%' //Partial match.
SELECT * FROM table_name WHERE entity_name LIKE 'search_key%' //Begins with.
SELECT * FROM table_name WHERE entity_name IN('search_key') //Equal to.
通常使用第一个查询。
数据库的大小约为 9GB。搜索过程非常缓慢。根据研究,我发现使用索引可能不起作用,因为我正在使用此进行搜索:entity_name LIKE '%search_key%
通配符出现在前面。分区也不起作用(如果我错了请更正)因为我们关注的是 varchar 字段。
欢迎提出任何想法/建议。
最佳答案
当您说 LIKE '%search_key'
本质上很慢时,您是对的。那种搜索词不是sargable因为它以 %
开头。 entity_name
列上的索引可能仍然有点帮助,特别是如果您的表有很多列:MySQL 可能能够扫描索引而不是表。但它永远不会很快。
您应该考虑使用 MySQL FULLTEXT searching对于这个应用程序。
关于类似mysql的查询拉取结果很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51244947/