同じデータで以下の手順を2つのバージョンのMySQLで実行しています。 私は "show full processlist"を実行します。 私が見る唯一の違いは、MySQLバージョン5.5.15が以下のようにすべてのSELECTに対してNAME_CONSTとCOLLATEを生成することです。 両方のDBの文字セットはlatin1です。NAME_CONSTのMySQLのプロシージャのパフォーマンスの問題
DECLAREプロシージャサンプル() BEGIN DECLARE A_Val int; DECLARE 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;
END;
MySQLバージョン毎ため= 5.5.15 はMySQLはNAME_CONSTとCOLLATEを生成選択し、
選択NAME_CONST下に見られるように( 'B_Val'、_ latin1'A12345' COLLATE 'latin1_swedish_ci')、SomeTableXからX_Val 。
MySQLのバージョン= 5.7.16 同じSQLが出NAME_CONSTとCOLLATEとはるかに速くexecuesで生成され
SomeTableXからB_Val、X_Valを選択します。
誰かがNAME_CONSTとCOLLATEの生成を無効にする方法を提案できますか? これらのNAME_CONSTとCOLLATEの生成を停止するようにMySQLに指示する方法はありますか?
なぜ、1つのMySQLバージョンが他のものより高速かもしれないのか、野生の推測:過去5年間にいくつかの技術的改善がありました。とにかく、あなたのコードは何をすべきですか?あなたの現在の手順はそれほど意味がありませんか、それともテストケースを持つだけですか?同じテストをしたいかもしれませんが、変数の代わりにテーブルから2列を選択してください(たとえば、 'select x_val、sometablexからx_valを選んでください)、それがまだ遅いかどうかを確認してください。 – Solarflare