ユーザのグループがDBD::mysql
を使用してPerlのDBI経由でmysqlにサブミットすることを許可した場合、データベースを変更したり、重要ではない情報を漏洩したり、データベースの負荷?もしそうなら、どうですか?mysqlでは、「説明しています...」は常に安全ですか?
私は"explain $whatever"
を介して、テーブル/列は(あなたがに持っているが、しかし、名を推測)と、表のおおよそどのように多くのレコードまたはインデックス付きフィールドの特定の値を持つレコードの数が存在するかを把握することができます知っています。インデックス化されていないフィールドの内容に関する情報を得ることはできません。
DBD::mysql
は複数のステートメントを許可してはいけません。したがって、どのクエリも実行することはできません(ただ1つのクエリを説明する)。サブクエリを実行するべきではなく、単に説明してください。
しかし、私はMySQLのエキスパートではなく、確かに私が気づいていないmysqlの機能もあります。
クエリプランを考え出す際に、オプティマイザは実際に式を実行して、インデックス付きフィールドが比較される値を思い付くことがありますか? atable.class
がインデックスではなく、ユニークでclass='unused'
にレコードを見つけていないだろうが、class='common'
100万レコードを見つけるだろうさ
explain select * from atable where class = somefunction(...)
。評価するかもしれないsomefunction(...)
?そして、somefunction(...)
はそれがデータを変更するように書くことができますか?
おそらくそれは安全ですが、私はとにかくそれをやりません;) 'explain'でだまされる理由がある人は、DBとmysql CLIのテストコピーを渡すべきです。テストDBを必要としない人は、クエリーを書くことから保存しなければならないので、 'explain'は必要ありません;) – hobbs