【发布时间】:2018-07-09 11:52:18
【问题描述】:
我有一个非常大的 mysql 数据库,由 35 个表组成。每个表的结构都不同,但都有一些共同的字段。 'entity_name' 是所有表格中的一个常见字段。这是一个VARCHAR 字段。有些表包含数百万条记录,而有些则包含数十亿条记录。
我正在所有这些表中搜索搜索键并提取实体名称,以及包含匹配记录的表中的一些常见字段;将结果推送到数组中,最后以 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 字段,因此分区也不起作用(如果我错了,请更正)。
欢迎任何想法/建议。
【问题讨论】:
-
(1) 如果您的数据库是 9GB,那么没有表有“数十亿”行。 (2) 您可能需要考虑全文索引。
-
实体名称作为进入数据库的主要方式对我来说不是一个好的选择。我将创建一个带有 entity_id 和 entity_name 的表,其中名称必须是唯一的,然后在所有其他表中使用该 id。但这并不能解决您的速度问题,除非不同名称的数量要少得多,并且在每个表中重复多次。
-
另一种旧的加快搜索速度的技术是限制需要搜索的内容。这通常是按时完成的。因此,您只能对不到 2 年的数据执行搜索,除非用户特别要求深入了解“存档”结果。
-
@KIKO Software 无法存档记录,搜索必须在完整数据集上进行。
标签: mysql sql sql-like query-performance