Я выполняю описанную ниже процедуру на двух версиях MySQL для одних и тех же данных, и я вижу значительные различия в производительности.
Когда я запускаю «Показать полный список процессов».
Единственное отличие, которое я вижу, заключается в том, что MySQL версии 5.5.15 генерирует NAME_CONST и COLLATE для каждого SELECT, как показано ниже.
Набор символов в обеих БД — латинский.
ОБЪЯВИТЬ ПРОЦЕДУРУ Sample ()
НАЧАТЬ
ОБЪЯВИТЬ A_Val int;
ОБЪЯВИТЬ B_Val varchar (50);
DECLARE ApplCursor CURSOR FOR
SELECT A, CONVERT(B, CHAR(50))
FROM SampleTable;OPEN ApplCursor;
Cursor_Loop: LOOP
FETCH ApplCursor INTO A_Val, B_Val;
SELECT B_Val, X_Val FROM SomeTableX;
END LOOP Cursor_Loop;
CLOSE ApplCursor;
КОНЕЦ;
Версия MySQL = 5.5.15
Для каждого выбора MySQL генерирует NAME_CONST и COLLATE, как показано ниже
выберите NAME_CONST (‘B_Val’, _ latin1’A12345 ‘COLLATE’ latin1_swedish_ci ‘), X_Val
от SomeTableX;
Версия MySQL = 5.7.16
Тот же SQL генерируется без NAME_CONST и COLLATE и выполняется намного быстрее
выберите B_Val, X_Val из SomeTableX;
Может кто-нибудь подсказать, как отключить генерацию NAME_CONST и COLLATE.
Есть ли способ сказать MySQL, чтобы прекратить генерировать эти дополнительные NAME_CONST и COLLATE ???
Так SHOW CREATE PROCEDURE
на обоих серверах. Вы, вероятно, увидите, что они были построены с разными CHARACTER SET
и / или COLLATION
,
Других решений пока нет …