Добрый день. Есть хранимая функция, она максимально оптимизирована для производительности, больше не выжать. Поэтому так и записана
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 для таких запросов ? Памяти хватает, сервер мощный. Где он буксует ?
Видно что в хранимой функции, но как ее оптимизировать ? почему меньшее кол-во строк выполняется в сумме быстрее чем большее ?