@whats

Как повысить производительность хранимых функций MYSQL?

Добрый день. Есть хранимая функция, она максимально оптимизирована для производительности, больше не выжать. Поэтому так и записана
DELIMITER $$

CREATE DEFINER=`root`@`127.0.0.1` FUNCTION `SORT_STR`(`string1` VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
    READS SQL DATA
    DETERMINISTIC
BEGIN
DECLARE sort VARCHAR(255);
DECLARE str1 VARCHAR(255);
DECLARE word VARCHAR(255);
CREATE TEMPORARY TABLE IF NOT EXISTS sort_t
(w VARCHAR(255)); 

SET str1 = LOWER(string1); 
    sub_str_loop: LOOP
		SET word = SUBSTRING_INDEX(str1,' ', 1);
		SET str1 = trim(replace(str1, word, ''));
		INSERT INTO sort_t set w = word;
		IF str1 = '' THEN
			LEAVE sub_str_loop;
		END IF;
    END LOOP sub_str_loop; 
	select group_concat(`w` ORDER BY `w` asc SEPARATOR  ' ') as words into sort from sort_t;
delete from  sort_t;
RETURN sort;
END


Делает она лишь 1, берет на входе строку -> разбивает ее на слова -> добавляет в временную таблицу -> сортирует -> отдает отсортированную строку.

Есть таблица InnoDB - количество записей 350 тысяч.
Есть колонка - Данные в ней примерно такие [Блок питания Chieftec A-135 APS-750C]

Update всей таблицы статичным значением, например нулл
UPDATE таблица SET колонка = null	
386398 row(s) affected 
Rows matched: 386398  Changed: 386398  Warnings: 0	
17.659 sec


И тут начинается магия. Непонятное увеличение времени выполнения.

Небольшой бенчмарк (количество обновляемых строк - время) Запросы идут друг за другом со смешением по ИД записи что бы их не было до этого в кеше
1 - 0.031
10 - 0.063
100 - 0.187
1000 - 3.775
10000 - 246.310


Получается я быстрее сделаю 10 запросов в хранимой процедуре по 100 строк чем 1 на 1000 строк.
Что нужно Mysql для таких запросов ? Памяти хватает, сервер мощный. Где он буксует ?
Видно что в хранимой функции, но как ее оптимизировать ? почему меньшее кол-во строк выполняется в сумме быстрее чем большее ?
  • Вопрос задан
  • 2500 просмотров
Решения вопроса 1
@whats Автор вопроса
Вся ветка обсуждения и решение проблемы.
sqlinfo.ru/forum/viewtopic.php?pid=40185
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap
Функция вызывается при select? Если да, я бы изменил логику:
* Добавил бы в исходную таблицу столбец "слова отсортированные"
* Сделал бы триггер на вставку и обновление, который бы заполнял столбец "слова отсортированные"
* select летает, insert стал незначительно медленней.

Вообще такие вещи сервер приложений не быстрей сделает? ( К примеру php)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы