我有一个非常庞大的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%
通配符char出现在前面。分区也不起作用(如果我错了,请更正),因为我们专注于varchar字段。
欢迎提出任何想法/建议。
答案 0 :(得分:3)
当您说LIKE '%search_key'
本质上很慢时,您是正确的。这类搜索词不是sargable,因为它以%
开头。 entity_name
列上的索引可能仍会有所帮助,尤其是在您的表具有许多列的情况下:MySQL可能能够扫描索引而不是表。但这永远不会很快。
您应考虑为此应用程序使用MySQL FULLTEXT searching。
答案 1 :(得分:0)
如果您的search_key是动态的(在文本中搜索),则最好使用其他类型的数据库。例如弹性或类似的东西。
如果您的search_key可以定义为ENUM,则将其移到另一列中,然后改用它。
以文本搜索不是mySQL方式。
答案 2 :(得分:0)
如果您要在网页中显示记录,那么我相信您可能不需要一次访问全部数据。处理海量数据的最佳方法是执行分页。
您可以将查询限制为记录数,一次可以是10、25或50,而执行查询可能不会花费很多时间。您的查询可以是-
SELECT * FROM table_name WHERE entity_name LIKE '%search_key%' limit x,y;
在此将x替换为下限,将y替换为上限。
如果您需要匹配记录的数量,请在下面的查询中仅用于计算数量。
SELECT count(*) FROM table_name WHERE entity_name LIKE '%search_key%';
希望这会有所帮助!