mysql之类的查询在拉结果方面非常慢

时间:2018-07-09 11:52:18

标签: mysql sql sql-like query-performance

我有一个非常庞大的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字段。

欢迎提出任何想法/建议。

3 个答案:

答案 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%';

希望这会有所帮助!