我有一个非常大的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字段。
欢迎提出任何意见/建议。
3条答案
按热度按时间kmpatx3s1#
你说得对
LIKE '%search_key'
天生就是慢的。这种搜索词不适合搜索,因为它以%
. 上的索引entity_name
column可能还是有帮助的,尤其是在表有很多列的情况下:mysql可能能够扫描索引而不是表。但它永远不会快。您应该考虑使用mysql全文搜索这个应用程序。
rm5edbpk2#
如果你的搜索键是动态的(在文本中搜索),最好使用不同类型的数据库。例如弹性的或类似的东西。
如果您的搜索关键字可以定义为enum,请在另一列中取出它,然后改用它。
在文本中搜索不是mysql的方式。
tsm1rwdh3#
如果你是在网页上显示你的记录,那么我相信你可能不需要在一次去一大堆的数据。对于如此庞大的数据量,最好的方法是执行分页。
您可以限制查询的记录数,一次可能是10、25或50条,执行查询可能不需要太多时间。您的查询可以是-
这里用下限替换x,用上限替换y。
如果您需要匹配记录的计数,请使用下面的查询来计算计数。
希望这有帮助!