Mysql 用于优化小表上重复查询的临时表或视图的替代方案

Mysql 用于优化小表上重复查询的临时表或视图的替代方案,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我有一张大约40000行的桌子。每个都有一个空格分隔的数字列表,范围从1到100。示例行在一列中具有唯一的标识名,在另一列中后跟例如“4 8 18 32” 我想将名称的自由文本搜索与包含特定数字的行数的计数结合起来。例如,给我计算有多少行与%word%匹配,以及每个数字1到100。这是一百个查询。如果上面的“481832”是表中唯一的匹配项,那么计数将是1:0、2:0、3:0、4:1。。。8: 1, ... 32:1 目前,我正在尝试使用最小令牌长度为1的InnoDB全文索引来完成这项工作,然后

我有一张大约40000行的桌子。每个都有一个空格分隔的数字列表,范围从1到100。示例行在一列中具有唯一的标识名,在另一列中后跟例如“4 8 18 32”

我想将名称的自由文本搜索与包含特定数字的行数的计数结合起来。例如,给我计算有多少行与%word%匹配,以及每个数字1到100。这是一百个查询。如果上面的“481832”是表中唯一的匹配项,那么计数将是1:0、2:0、3:0、4:1。。。8: 1, ... 32:1

目前,我正在尝试使用最小令牌长度为1的InnoDB全文索引来完成这项工作,然后以二进制模式进行搜索。我的查询如下所示:

(SELECT COUNT(*) FROM `table` WHERE MATCH (`numbers`) AGAINST ('+34' IN BOOLEAN MODE) AND `name` LIKE '%word%') as `34`,
(SELECT COUNT(*) FROM `table` WHERE MATCH (`numbers`) AGAINST ('+35' IN BOOLEAN MODE) AND `name` LIKE '%word%') as `35`,
并被合并成一个结果。这大约需要两三秒钟,这是一个很长的时间

我尝试使用一个临时表来进行相似匹配,然后只使用布尔模式搜索与之对应的数字,但是我不能在查询中多次重用临时表引用,在这里它被重用了一百次。我还尝试创建一个类似部分的视图,但没有看到太多的加速。告诉视图使用algorithm=tentable是不可能的,因为全文索引无法传递


我是否以根本不正确的方式使用数据库?是否有一种策略可以使查询速度大大加快?

我将对该表只尝试一个查询,而不是100个单独的查询:

SELECT 
       -- using CASE expression --
       SUM( case when `numbers` like '%+34%' and `name` LIKE '%word%'
                 then 1 else 0 end ) As `34`,
       -- or using IF ---
       SUM( IF( `numbers` like '%+35%' and `name` LIKE '%word%', 1, 0 )) As `35`
       .......
FROM table;
此查询在表上执行完整的表扫描,但仅执行一次扫描,而不是一系列100次扫描。
可能会更快-试试看。

全表扫描不是坏事,索引并不总是好事。

我必须问的第一个问题是,为什么要有一列由逗号分隔的数字组成的文本,而不是一列由8位整数和引用ID组成的单独表?所有这些字符串的解析都是一个很大的性能问题,在当前布局中,查询的效率无法提高。我认为将一个40000行的表转换成400000行的表可能会让它变得更慢,因为它是全文索引的,并且所有的搜索都是二进制模式。根据表的宽度,将
如“%word%”
移动到
WHERE
中可能会更快。这假定
name
列上有一个索引,并且只返回一小部分行。否则,我会同意扫描可能不会那么糟糕毕竟这里。。。