Ошибка SQL [1038] [HY001]: не хватает памяти сортировки, рассмотрите возможность увеличения размера буфера сортировки сервера

#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