有点奇怪。我有一个函数起初运行得非常好,比如在选择返回值和其他一些列时执行 15ms 和 10ms 获取。但是,如果不断刷新相同的查询,一遍又一遍,查询的执行就会上升。所以首先是 15 毫秒,然后是 17 毫秒,然后……我一直到 900 毫秒。主要是获取及时增加,但执行也是如此。所以最后它将是 600 毫秒的获取和 300 毫秒的执行。有什么想法吗?
功能。我只尝试了一个简单的 IF/ELSEIF,但它在性能方面给出了完全相同的结果。
create function get_table(var_account_id int unsigned) returns varchar(20)
reads sql data
BEGIN
RETURN IF(
(SELECT EXISTS(SELECT TRUE
FROM TableA
WHERE account_id = var_account_id
AND expiring_at > CURRENT_TIMESTAMP)), 'TableA',
IF((SELECT EXISTS(SELECT TRUE
FROM TableB
WHERE account_id = var_account_id
AND expiring_at > CURRENT_TIMESTAMP)), 'TableB',
IF((SELECT EXISTS(SELECT TRUE
FROM TableC
WHERE account_id = var_account_id
AND expiring_at > CURRENT_TIMESTAMP)), 'TableC',
IF((SELECT EXISTS(SELECT TRUE
FROM TableD
WHERE account_id = var_account_id
AND expiring_at > CURRENT_TIMESTAMP)), 'TableD',
NULL)
)));
END;
使用 var_account_id = 1 运行一次后的功能说明
9,SUBQUERY,TableD,,ref,"TableD_expiring_at_index,TableD_account_id_index",TableD_account_id_index,4,const,1,100,Using where
7,SUBQUERY,TableC,,ref,"TableC_account_id_index,TableC_expiring_at_index",TableC_account_id_index,4,const,1,5,Using where
5,SUBQUERY,TableB,,ref,"TableB_expiring_at_index,TableB_account_id_index",TableB_account_id_index,4,const,1,9.26,Using where
3,SUBQUERY,TableA,,ref,"TableA_expiring_at_index,TableA_account_id_index",TableA_account_id_index,4,const,1,100,Using where
在 account_id 和 expiring_at 上放置复合索引完全没有效果
我运行一个简单的查询,比如
SELECT TableXYZ.*, get_table(TableXYZ.account_id) AS some_value FROM TableXYZ LIMIT 500;
我已经在更复杂的查询上运行它,但结果总是一样的,一开始很快,重新运行相同的 SELECT 后速度很慢,比如说每秒 5 次,持续 30 秒。即使我让 MySQL 冷却了一会儿,回来,第一次运行仍然是 900 毫秒。而且我相信它可以继续上涨。解决此问题的唯一方法是在 Windows 中重新启动 mysql 服务。
SELECT的解释:
1,SIMPLE,TableXYZ,,ALL,,,,,695598,100,
如果重要的话,我会在 Windows 10 上运行这些,本地。