#mysql #stored-procedures #buffer
#mysql #хранимые процедуры #буфер
Вопрос:
Я создал хранимую процедуру в mysql для поиска статей. Поэтому, когда я хочу вызвать его, я получаю эту ошибку.
Ошибка SQL [1038] [HY001]: не хватает памяти сортировки, рассмотрите возможность увеличения размера буфера сортировки сервера
Цель моего кода — отсортировать статьи сначала по названию относительно, а затем по описанию относительно.
Также после увеличения размера буфера (и перезапуска службы mysql, а затем повторного вызова sp) я получаю эту ошибку: Ошибка SQL [S1000]: не удалось получить статус транзакции только для чтения с сервера
create PROCEDURE art_usp_Article_Search(in SearchTerm varchar(200),in SortColumn varchar(100),in SortOrder varchar(5),in PageNumber int,in PageSize int)
BEGIN
DECLARE StartRow INT;
DECLARE EndRow INT;
declare NSortColumn varchar(100);
declare NSortOrder varchar(100);
-- calculate the starting and ending of records
SET NSortColumn = LOWER(IFNULL(SortColumn, ''));
SET NSortOrder = LOWER(IfNULL(SortOrder, ''));
SET StartRow = (PageNumber - 1) * PageSize ;
SET EndRow = (PageNumber * PageSize) 1 ;
WITH CTETitleResult AS (
SELECT ROW_NUMBER() OVER (ORDER BY
CASE
WHEN (@SortColumn = 'title' AND @SortOrder='asc') THEN title
WHEN (@SortColumn = 'date' AND @SortOrder='asc') THEN date
end
) AS RowNumber
, COUNT(*) OVER () AS TotalCount
,id,code,categoryId ,title,shortDescription ,description ,tags ,content,date,time,typeId,isActive,isSpecial,visited,author,imageId,statusId,created_by,updated_by,created_at,updated_at
FROM art_article aa
WHERE isActive = 1
AND (
(IfNULL(SearchTerm, '') = '' OR title LIKE CONCAT('%', SearchTerm, '%'))
)
),CTEDescriptionResult AS (
SELECT ROW_NUMBER() OVER (ORDER BY
CASE
WHEN (@SortColumn = 'title' AND @SortOrder='asc') THEN title
WHEN (@SortColumn = 'date' AND @SortOrder='asc') THEN date
end
) AS RowNumber
, COUNT(*) OVER () AS TotalCount
,id,code,categoryId ,title,shortDescription ,description ,tags ,content,date,time,typeId,isActive,isSpecial,visited,author,imageId,statusId,created_by,updated_by,created_at,updated_at
FROM art_article aa
WHERE isActive = 1
AND (
(IfNULL(SearchTerm, '') = '' OR shortDescription LIKE CONCAT('%', SearchTerm, '%'))
)
)
SELECT *
FROM CTETitleResult
WHERE RowNumber > StartRow AND RowNumber < EndRow
union
SELECT *
FROM CTEDescriptionResult
WHERE RowNumber > StartRow AND RowNumber < EndRow
ORDER BY RowNumber;
END
call art_usp_Article_Search('','title','asc',1,10)
Ответ №1:
Временное решение
Просто запустите запрос mysql
УСТАНОВИТЕ ГЛОБАЛЬНЫЙ sort_buffer_size = 256000000 // Он будет сброшен после перезагрузки сервера
Чтобы установить постоянный
Отредактируйте файл ниже и добавьте
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
sort_buffer_size = 256000000
перезапуск службы sudo mysql