mysqlヒント

1. クエリ結果を縦に表示する
2. --safe-updatesオプションを使用する
3. mysql自動再接続の無効化

このセクションではmysqlをさらに効果的に使用するテクニックを紹介します。

1. クエリ結果を縦に表示する

クエリ結果の中にはたて表示のほうが、横テーブルフォーマットよりも読みやすいものがあります。セミコロンの代わりに\Gがついたクエリを消去することで、クエリは縦に表示できます。例えば、新しい行を含む長いテキスト値は立て表示のほうがはるかに読みやすいです。

mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
     date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
    reply: monty@no.spam.com
  mail_to: "Thimble Smith" <tim@no.spam.com>
      sbj: UTF-8
      txt: >>>>> "Thimble" == Thimble Smith writes:

Thimble> Hi.  I think this is a good idea.  Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.

Yes, please do that.

Regards,
Monty
     file: inbox-jani-1
     hash: 190402944
1 row in set (0.09 sec)

2. --safe-updatesオプションを使用する

初心者にとって、使いやすいスタートアップオプションは--safe-updates (あるいは同じ効果のある--i-am-a-dummy)です。これはDELETE FROM tbl_nameステートメントを発行したが、WHERE節を忘れてしまった場合に便利です。通常、このようなステートメントはテーブルから全ての行を消去します。--safe-updatesでは、行を表すキー値をとくていすることで飲み、行を消去することができます。これにより、間違いや事故を予防します。

--safe-updatesオプションを使用するとき、mysqlはMySQLサーバに接続した際以下のステートメントを 発行します。

SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;

詳しくはこちらをを参照してください項 「SET 構文」。

SETステートメントには以下の効果があります。

  • UPDATEDELETEステートメントは、WHERE節内でキー制限を特定するか、LIMIT節を提供するか(あるいは両方)しないかぎり、実行は許容されません。例:

    UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
    
    UPDATE tbl_name SET not_key_column=val LIMIT 1;
  • サーバは全ての大きいSELECT結果を1,000行に限定します。ただし、ステートメントにLIMIT節が含まれていない場合にのみです。

  • サーバは、1,000,000の行コンビネーションをチェックしかなければいけない、複数テーブルSELECTステートメントをアボートします。

1,000 と1,000,000以外の制限を特定するには、--select_limit--max_join_sizeオプションを使用することでデフォルトを重ね処理することができあます。

shell> mysql --safe-updates --select_limit=500 --max_join_size=10000

3. mysql自動再接続の無効化

もしmysqlクライアントが、ステートメントの送信中にサーバとの接続が遮断された場合、直ちに自動的に再接続し、ステートメントの送信を再度試みます。ただし、mysqlが再接続に成功しても、最初の接続が遮断された時点で前セッションオブジェクトと設定は失われています。この中には、テンポラリテーブル、オートコミットモード、ユーザによって定義された変数やセッション変数も含まれています。加えて、現トランザクションロールバックも。この動作は危険な場合があります。例えば、以下の例ではサーバはユーザの了解なしに、最初のステートメントと二番目のステートメントの間に終了し、リスタートさせられています。

mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: test

Query OK, 1 row affected (1.30 sec)

mysql> SELECT * FROM t;
+------+
| a    |
+------+
| NULL |
+------+
1 row in set (0.05 sec)

@aユーザ変数は接続と共に失われ、再接続語は定義されていません。接続が失われた際に、mysqlがエラーで終了することが望ましい場合、mysqlクライアントを--skip-reconnectオプションでスタートさせることができます。

自動再接続と再接続時の状態と効果に関する追加情報は、項 「自動再接続挙動の管理」を参照してください。