我有这个用例:我需要在同一个表上多次执行相同的“逻辑”查询,固定次数(相同的语义,仅改变与“WHERE”语句进行比较的值) .
查询布局:
SELECT [(SUM(col_name),col_name,...)]
FROM table_name
WHERE expr AND expr...
我假装要提高这项任务的性能。
通过阅读我在这里找到的有关此问题的文章以及一些额外的研究,我可以指出以下相关事实:
- 不使用内部临时表(在查询中使用 EXPLAIN)
- 未使用查询缓存(不是相同查询)
如果我在内存(RAM,ENGINE=MEMORY)中创建一个临时表来镜像相关表,然后对该内存表执行所有查询,我可以提高性能吗?:
CREATE TABLE tmp_table_name ENGINE=MEMORY SELECT * FROM table_name;
Perform the queries over tmp_table_name
DROP TABLE tmp_table_name;
参见MySQL docs: The MEMORY (HEAP) Storage Engine
谢谢。
最佳答案
MEMORY 会提高性能吗?基本上没有。
不,如果你不能使用MEMORY,你就不能使用MEMORY - see limitations
不,如果您花费太多时间创建表,MEMORY 会变慢。
否,因为副本不会是最新的。 (好吧,也许这不是问题。)
否,因为您正在从其他缓存中窃取信息,从而使其他查询变慢。
否 - 如果 VARCHAR 在您的版本中变成 CHAR,则 MEMORY 表可能比非 MEMORY 表大得多,从而会出现其他问题。
也许——如果所有内容都缓存在 RAM 中,MEMORY 将以大约相同的速度运行。
您的特定示例可能会加速
- 使用合适的“复合”索引。 (请向我们展示您的选择的详细信息)
- 创建和维护汇总表——如果这是“数据仓库”应用程序。 (再次,让我们看看详细信息。)
关于MySQL:使用内存存储引擎来提高此查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29652290/