Hatena::Groupnysql

MySQL初心者日記

カテゴリー
 | 

2009-11-17

in句に指定できる個数の制限について

| 01:57 | in句に指定できる個数の制限について - MySQL初心者日記 を含むブックマーク はてなブックマーク - in句に指定できる個数の制限について - MySQL初心者日記

オラクルだと、in句に1001個以上指定するとエラーになる。

MySQLだとどうなるのか調べてみた。

前提条件は以下のとおり

バージョン

mysql> select version();
--------------
select version()
--------------

+------------+
| version()  |
+------------+
| 5.0.27-log |
+------------+
1 row in set (0.00 sec)

テスト用のテーブルは以下の通り。ここに100万件のデータを入れてみた。

mysql> desc test_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | 0       |       |
| id2   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

in句内の要素を10万個指定するSQLを作成するスクリプトを、書いてみた。

~$ cat hoge.sh
#!/bin/sh

echo "use test;"
echo -n 'select count(*) from test_tbl where id2 in ('
for m in `jot 100000 1`
do
if [ $m -ne 1 ]; then
        echo -n ","
fi
echo -n $m;
done
echo  ');'

上記のスクリプトを実行してみたが、問題なく実行できた。

次に、100万個でテストしてみたところ、以下のエラーが発生した。

~$ ./hoge.sh | mysql
ERROR 1153 (08S01) at line 2: Got a packet bigger than 'max_allowed_packet' bytes

max_allowed_packetは、mysqlサーバmysqlクライアントから受け取るパケットサイズの最大値のことらしい。

max_allowed_packetの現在値は以下のようにしてみることができる。

mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.37 sec)

現在は、1Mで設定されているらしい。

設定変更方法は以下の通り。

#vi myconf
max_allowed_packet = 16M

※ mysqldの再起動が必要と思われる。

参考にさせていただいたページ

max_allowed_packet、巨大なデータをサーバへ送る場合 - mir the developer

 |