我發現mysql在查詢陳述句中使用自定函式速度會非常慢,哪怕做很簡單的計算,只要用到了自定義函式,相比使用原生的函式要慢一個數量級。而且在自定義函式中每多執行一條哪怕是最簡單的陳述句都會變得更慢。
下面是我做的一個簡單的測驗:
首先創建一張包括一萬條資料的表:
create table tmp (s varchar(1000)) as select .... limit 10000;
然后創建3個自定義函式,簡單的計算字符長度并且做10次加法:
mylength1:在一條陳述句中加十次;
DELIMITER $$
CREATE FUNCTION `mylength1`( s1 VARCHAR(255)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE s1_len, i INT;
SET s1_len = 0;
SET s1_len = s1_len+length(s1)+length(s1)+length(s1)+length(s1)+length(s1)+length(s1)+length(s1)+length(s1)+length(s1)+length(s1);
RETURN s1_len;
END;$$
mylength2:通過十條陳述句中完成加十次;
DELIMITER $$
CREATE FUNCTION `mylength2`( s1 VARCHAR(255)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE s1_len, i INT;
SET s1_len = 0;
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
SET s1_len = s1_len+length(s1);
RETURN s1_len;
END;$$
mylength3:使用while回圈陳述句完成加十次;
DELIMITER $$
CREATE FUNCTION `mylength3`( s1 VARCHAR(255)) RETURNS int(11)
DETERMINISTIC
BEGIN
DECLARE s1_len, i INT;
SET s1_len = length(s1);
SET i = 0;
WHILE i <= 10 DO
SET s1_len = s1_len+length(s1);
SET i = i + 1;
END WHILE;
RETURN s1_len;
END;$$
再對比直接使用原生的函式,用于對比的 sql 如下:
select max(length(s)) a from tmp;
select max(length(s)+length(s)+length(s)+length(s)+length(s)+length(s)+length(s)+length(s)+length(s)+length(s)) a from tmp;
select max(mylength1(s)) from tmp a;
select max(mylength2(s)) from tmp a;
select max(mylength3(s)) from tmp a;
select max(levenshtein('任何一個字串', s)) from tmp a;
執行結果如下:
從上面的結果可以看到:
1. 呼叫原生函式一次和10次的用時差不多,都是0.01秒就完成了;實際上呼叫10次要稍慢,有時候會是0.02秒,但差別不大;
2. 呼叫mylength1,自定義函式在一個陳述句中完成10次加法,耗時達到0.39秒,增加了幾十倍;
3. 呼叫mylenght2,自定義函式使用10條陳述句完成10次加法,耗時達到0.52秒,再增加了30%;
4. 呼叫mylength3,自定義函式使用while回圈10次做加法,耗時達到了1.06秒,再次翻倍;
5. 呼叫levenshtein自定義函式,耗時達到了9.21秒,再次增加了近10倍;
可以說mysql查詢中呼叫自定義函式的效率驚人的低。是有什么解決辦法嗎?
我在論壇上找到這篇文章,但是并不能解決這個問題:
https://bugs.mysql.com/bug.php?id=34254
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/281800.html
標籤:MySQL