2017-03-15 3 views
1

私は数十のカラムを持つMySQL 5.7のテーブルを持っています。それらの1つは、列A、B、Cに基づいて値を計算するために大きな式を使用する生成列(Stored、not virtual)です。新しい行が挿入されたときにMySQLが値を計算するのに少し時間がかかると思いますまたは更新されます。生成された列の計算は、行を更新すると常にトリガされますか?

私の簡単な質問です:

は、私が行の他の列(などF、Gを、)更新するときの計算があまりにもトリガーですか?

あなたの答えを証明するための参照(リンク)を私に送信できますか?

おかげ

編集:ストアド

:行が を挿入または更新されたときに列の値が評価され、保存されている

を私はすでにMySQLのofficial documentationが@Barmarによって提案読んでいました。あなたが見ることができるように

、実際に意味それはが挿入またはを更新したが、私はを更新することを推測する:を私はMySQLが計算を実行しないために十分にスマートであると仮定ので、関連の列がを更新している場合それらの列が更新されない場合これは実際に私が確認したいという前提です。 MySQL documentationから

答えて

0

、MySQLは参照列が変更されるように指定されている場合にのみ生成され記憶された列を再評価します(注:必ずしもがちょうど変更する列のリストで、変更)。たとえば、これを確認できます。デバッグビルドを使用します。

create table test (
    id int auto_increment primary key, 
    x int, 
    y int, 
    gencolx int as (2*x) stored, 
    gencolconst int as (2) stored 
); 

insert into test (x, y) values (2, 2); 
update test set x = 4; 
update test set y = 5; 
update test set x = 4; 

最初updatexに依存する生成列gencolxの評価をトリガーする:

THD::decide_logging_format: info: query: update test set x = 4 
update_generated_read_fields: info: field 'gencolx' - skipped 
update_generated_read_fields: info: field 'gencolconst' - skipped 
update_generated_write_fields: info: field 'gencolx' - updated 
update_generated_write_fields: info: field 'gencolconst' - skipped 

updateは、任意の生成された列に使用される列を更新し、従って彼らありません再計算されません:

THD::decide_logging_format: info: query: update test set y = 5 
update_generated_read_fields: info: field 'gencolx' - skipped 
update_generated_read_fields: info: field 'gencolconst' - skipped 
update_generated_write_fields: info: field 'gencolx' - skipped 
update_generated_write_fields: info: field 'gencolconst' - skipped 

残念ながら、MySQLは値が実際に変更されました。その列が宛先列である場合のみです。

THD::decide_logging_format: info: query: update test set x = 4 
update_generated_read_fields: info: field 'gencolx' - skipped 
update_generated_read_fields: info: field 'gencolconst' - skipped 
update_generated_write_fields: info: field 'gencolx' - updated 
update_generated_write_fields: info: field 'gencolconst' - skipped 
mysql_update: info: 0 records updated 

同じ:列xupdate文で変更する列であるため、だから、最後updateは、実際には変わらないxの値を残していること、まだ、依存生成された列の評価になりますあなたが使用すると、途中で起こります。 update test set x = x、行を変更しません。

update_generated_read_fieldsおよびupdate_generated_write_fieldsは、生成されたフィールドの式を評価する関連する関数です。 gencolconstの定数式が更新で評価されないこともわかります。

残念なことに(そしてちょっとしたメモとして)、そのテーブルにトリガーが存在すると、update_generated_write_fieldsが2回呼び出され、最初に更新された場合は2番目の生成された列が評価されますそれが問題なのかどうかは関係ありませんinsertトリガーとupdateを実行している場合、トリガーの純粋な存在で十分です。

+0

私は十分にクリアなので、私は正しい答えを受け入れました。ありがとう! – Delmo

0

  • STORED:列の値が評価され、行が挿入または更新されたときに記憶されています。

これは明らかに、行の他の列を更新すると計算が開始されます。 update -statementについて

+0

ありがとう@Barmar。私はすでにMySQLのドキュメントを読んでいましたが(残念ですが、残念ですが)、関連する列が更新されていない場合、MySQLが計算を妨げるほどスマートではないという考えは私には難しいです。すでに持っているのと同じ値で行を更新します。 – Delmo

+1

ああ、私はあなたの質問のその部分を逃した。私の推測では、計算に影響を与える列がどれも変更されていないときを検出するのに十分にスマートですが、テストする方法はわかりません。 – Barmar

関連する問題