私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレMySQL 総合 Part15
mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ☆
レスフィルター : (試験中)
MySQL5の限界を上げたいのですが、どこをチューニングしればいいのか教えてください。
基本的なチューニングは出来てると思います。
サーバーは、DB専用で4CPU メモリ8GB
max_connections 許容接続数 2000 本
Max_used_connections 過去発生した最大接続数 916 本
(mysql接続のみの数字)
916本で、MySQLに接続が出来なくなってしまいます。
これを2000まで持って行きたいのです。
CPUやメモリは、余裕があります。
アドバイスを下さい。神様。
OSの種類とバージョン
MySQLのバージョン
32bit/64bit
ulimit -aの出力
917本目をつなごうとしたときのエラーメッセージ
ぐらいは書かないと神様でも分からないと思うよ
MySQLのバージョン
32bit/64bit
ulimit -aの出力
917本目をつなごうとしたときのエラーメッセージ
ぐらいは書かないと神様でも分からないと思うよ
そうですよね。。
OSはdebian Etch 64bit
Linux db 2.6.18-6-amd64 #1 SMP Fri Oct 10 05:11:18 UTC 2008 x86_64 GNU/Linux
サーバー側:MySQL5.0.32-Debian_7etch8-log
クライアント側:MySQL5.0.32
エラーは出てないですが、WEBサーバーから接続が出来なくなってしまいます。
しばらくしたら、接続出来るようになるのですが・・。
まず、MySQLへの接続なしで、負荷ツールで負荷をかけても問題なく処理されるのですが、
MySQLへの接続をすると、しばらくして接続が出来なくなります。
Apache2とMySQL5のサーバーは物理的に分かれています。
OSはdebian Etch 64bit
Linux db 2.6.18-6-amd64 #1 SMP Fri Oct 10 05:11:18 UTC 2008 x86_64 GNU/Linux
サーバー側:MySQL5.0.32-Debian_7etch8-log
クライアント側:MySQL5.0.32
エラーは出てないですが、WEBサーバーから接続が出来なくなってしまいます。
しばらくしたら、接続出来るようになるのですが・・。
まず、MySQLへの接続なしで、負荷ツールで負荷をかけても問題なく処理されるのですが、
MySQLへの接続をすると、しばらくして接続が出来なくなります。
Apache2とMySQL5のサーバーは物理的に分かれています。
max_connectionsを増やすときは、open_files_limitも増やす必要がある。
sql/mysqld.cc
static int init_common_variables(
~
max_open_files= max(max(wanted_files, max_connections*5), open_files_
files= my_set_max_open_files(max_open_files);
/* ↑ここでulimitのopen files制限に引っかかるなどしてしまうと */
if (files < wanted_files) {
if (!open_files_limit) {
max_connections= (ulong) min(files-10-TABLE_OPEN_CACHE_MIN*2, max_connections);
/* ↑ ここでmax_connectionsを減らされてしまう。
mysqldのログでこんなのが出てないかも確認してみて。
[Warning] Changed limits: max_open_files: 1024 max_connections: 886 table_cache: 64
でもデータベースに900接続って時点でわりと異常なので
アプリケーションがきちんと切断してるかも確認してください。
sql/mysqld.cc
static int init_common_variables(
~
max_open_files= max(max(wanted_files, max_connections*5), open_files_
files= my_set_max_open_files(max_open_files);
/* ↑ここでulimitのopen files制限に引っかかるなどしてしまうと */
if (files < wanted_files) {
if (!open_files_limit) {
max_connections= (ulong) min(files-10-TABLE_OPEN_CACHE_MIN*2, max_connections);
/* ↑ ここでmax_connectionsを減らされてしまう。
mysqldのログでこんなのが出てないかも確認してみて。
[Warning] Changed limits: max_open_files: 1024 max_connections: 886 table_cache: 64
でもデータベースに900接続って時点でわりと異常なので
アプリケーションがきちんと切断してるかも確認してください。
ありがとうございます。
早速、ログを見てみましたけど、何も吐き出されてませんでした。
負荷ツールを使ってデータを取ってみたのですが、下記のコマンドで1800まで行って、実際にDBへ繋げたのが140まで下がってきた所でした。
#netstat -an | wc -l
1800
もしかして、何か根本的におかしいのかな。
アプリ側では、明示的に切断はしてませんが、、スクリプトが終われば、勝手に切断されるんですよね??
PHPとPDOで接続しています。
あと、よく分かりませんが、
Max_used_connections 過去発生した最大接続数 1786 本 まで行きました。
けど、ページが表示されない・・待ちの状態で、DB接続出来なくタイムアウトに。
なんでしょうね・・。
早速、ログを見てみましたけど、何も吐き出されてませんでした。
負荷ツールを使ってデータを取ってみたのですが、下記のコマンドで1800まで行って、実際にDBへ繋げたのが140まで下がってきた所でした。
#netstat -an | wc -l
1800
もしかして、何か根本的におかしいのかな。
アプリ側では、明示的に切断はしてませんが、、スクリプトが終われば、勝手に切断されるんですよね??
PHPとPDOで接続しています。
あと、よく分かりませんが、
Max_used_connections 過去発生した最大接続数 1786 本 まで行きました。
けど、ページが表示されない・・待ちの状態で、DB接続出来なくタイムアウトに。
なんでしょうね・・。
色々調べてみましたが、netstat -anのコマンドで見てみると「ESTABLISHED」だらけになってました。
#netstat -an | wc -l で 140以下になればうまく接続出来るようです。
#netstat -an | wc -l で 140以下になればうまく接続出来るようです。
linux同士でレプリケーションをしているときに、
cronで同期ができているかどうかをチェックするにはどのようにすればいいでしょうか?
レプリケーションができているかどうかを
シェルスクリプトから確認するにはどのように行えばいいでしょうか?
cronで同期ができているかどうかをチェックするにはどのようにすればいいでしょうか?
レプリケーションができているかどうかを
シェルスクリプトから確認するにはどのように行えばいいでしょうか?
質問ばかりですいません・・。
mytop で見てると、Userが「unauthent」になっているのが多いのですが、これはどういう意味なのでしょうか?
AUTO_INCREMENTでPRIYMARY KEYである行(行の名前はid)を追加するSQLを
下記のように組みました。
alter table input add column input int PRIYMARY KEY(id) AUTO_INCREMENT;
上記だとエラーだとになります。どこがおかしいのでしょうか?
ぐぐってみてもわからないので質問させていただきました。ご教授頂ければ
幸いです。
下記のように組みました。
alter table input add column input int PRIYMARY KEY(id) AUTO_INCREMENT;
上記だとエラーだとになります。どこがおかしいのでしょうか?
ぐぐってみてもわからないので質問させていただきました。ご教授頂ければ
幸いです。
タイポがありました。正しくは
alter table input add column input int PRIMARY KEY(id) AUTO_INCREMENT;
です。
alter table input add column input int PRIMARY KEY(id) AUTO_INCREMENT;
です。
[mysqld]
character_set_server = utf8
[client]
default_character_set = cp932
ねんのため一回データベースとテーブルつくりなおしてみて。
character_set_server = utf8
[client]
default_character_set = cp932
ねんのため一回データベースとテーブルつくりなおしてみて。
スロークエリを吐くこと自体の負荷は
100MBのファイルに100バイト追記するのも
1KBのファイルに100バイト追記するのも変わらんよ。
それはおいといて、
スロークエリログが100MBも出るってことは
そもそもチューニングされてないってことだよね。
そのデータベースは遅いだろうね。
100MBのファイルに100バイト追記するのも
1KBのファイルに100バイト追記するのも変わらんよ。
それはおいといて、
スロークエリログが100MBも出るってことは
そもそもチューニングされてないってことだよね。
そのデータベースは遅いだろうね。
どなたかお助けください。
max_allowed_packetを4Mにセットした上で、マルチプルインサートを使って
9000件程度のデータを4MB弱のSQL文にまとめて実行しているのですが
Packets larger than max_allowed_packet are not allowed.エラーが
出てしまいます。
登録すべきデータ件数が多いので、出来るだけまとめて登録したいのですが
SQL文が実際にはどのくらいのパケットサイズになるかを見積もるには
どうすればよいのでしょうか? どこまで削れば通るのか皆目見当がつかないもので…orz
max_allowed_packetを4Mにセットした上で、マルチプルインサートを使って
9000件程度のデータを4MB弱のSQL文にまとめて実行しているのですが
Packets larger than max_allowed_packet are not allowed.エラーが
出てしまいます。
登録すべきデータ件数が多いので、出来るだけまとめて登録したいのですが
SQL文が実際にはどのくらいのパケットサイズになるかを見積もるには
どうすればよいのでしょうか? どこまで削れば通るのか皆目見当がつかないもので…orz
max_allowed_packet を 100M とか設定して、通るまで減らしてみたらだめなの ?
>>71
ご指摘ありがとうございます。データ総数が100万件を軽く超えるので
少しでも高速化するため、プログラム内でmax_allowed_packet値を取得して、
それと見比べながらSQL文を構築、限界まで伸ばしてから実行、という
手順を取っています。全件つなげても流石に100MBは行かないと思いますが
限られた範囲で頑張れたらなぁ、と。わがままなのですが。
なお、SQL文を短くするほうで試してみましたところ、
9215件分の 3,825,253byte のSQL文は通りましたが、
9425件分の 3,911,372byte はだめでした。max 4,194,304byte に対して
300KB近くの余裕が必要ということで、MySQL内部での処理時には1件毎に
何らかのヘッダが付いて処理されていると推測しています(流石にSQL
1文に300KBは無いと)。で、そのヘッダサイズが分かれば解決!と
思っているのですが、そもそもこの考えが正しいのか皆目見当が付きません。
MySQL内部でのパケット構造はググってもなかなか見つからないもので
引き続きお知恵をお貸しいただければ幸いです。
ご指摘ありがとうございます。データ総数が100万件を軽く超えるので
少しでも高速化するため、プログラム内でmax_allowed_packet値を取得して、
それと見比べながらSQL文を構築、限界まで伸ばしてから実行、という
手順を取っています。全件つなげても流石に100MBは行かないと思いますが
限られた範囲で頑張れたらなぁ、と。わがままなのですが。
なお、SQL文を短くするほうで試してみましたところ、
9215件分の 3,825,253byte のSQL文は通りましたが、
9425件分の 3,911,372byte はだめでした。max 4,194,304byte に対して
300KB近くの余裕が必要ということで、MySQL内部での処理時には1件毎に
何らかのヘッダが付いて処理されていると推測しています(流石にSQL
1文に300KBは無いと)。で、そのヘッダサイズが分かれば解決!と
思っているのですが、そもそもこの考えが正しいのか皆目見当が付きません。
MySQL内部でのパケット構造はググってもなかなか見つからないもので
引き続きお知恵をお貸しいただければ幸いです。
そのまえに50件ずつINSERTするのと5000件ずつINSERTするので
どれだけ性能差があるのか測ってみたら?
一般的には10~100件あたりに最適値があるんだぞ
どれだけ性能差があるのか測ってみたら?
一般的には10~100件あたりに最適値があるんだぞ
質問です。
mysql4.1までテーブルを作った際に、
数値型のカラムのデフォルト値は、明示しなくても0になりましたが、
現在試している5.0.67ではデフォルト値がNULLになってしまいます。
これは5.0からは明示しなければいけない仕様に変わったんでしょうか?
テーブル作成クエリの例と作成したカラムの内容は以下のとおりになります。
クエリ
create table test_table( col int not null );
カラム内容
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| col | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
すみませんが、どなたか教えていただけますよう、よろしくお願いいたします。
mysql4.1までテーブルを作った際に、
数値型のカラムのデフォルト値は、明示しなくても0になりましたが、
現在試している5.0.67ではデフォルト値がNULLになってしまいます。
これは5.0からは明示しなければいけない仕様に変わったんでしょうか?
テーブル作成クエリの例と作成したカラムの内容は以下のとおりになります。
クエリ
create table test_table( col int not null );
カラム内容
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| col | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
すみませんが、どなたか教えていただけますよう、よろしくお願いいたします。
sourceコマンドで大量のinsert文を入れてるんだけど
1行目だけ必ずエラーが出る
その1行目を手動で入れるとエラーは出ない
2行目以降は全て正常に入る
なんだろう?
UTF-8に統一しててエンコード問題でもないと思うんだけど
1行目だけ必ずエラーが出る
その1行目を手動で入れるとエラーは出ない
2行目以降は全て正常に入る
なんだろう?
UTF-8に統一しててエンコード問題でもないと思うんだけど
>>75
SQLモードによるんだそうだ。
http://dev.mysql.com/doc/refman/5.1/ja/data-type-defaults.html
>>76
BOMがついてるとか?
ためしてないけど
SQLモードによるんだそうだ。
http://dev.mysql.com/doc/refman/5.1/ja/data-type-defaults.html
>>76
BOMがついてるとか?
ためしてないけど
>>80
名前の通り。そのまんまの用途だと気づけ。
名前の通り。そのまんまの用途だと気づけ。
mysql5.01のバッチモードにて、あるテーブルに条件にあるデータが入っていた場合、後続バッチを強制中止させたいのですが。
select 1/count(*) from hoge;
として、レコード0の場合もエラーになりません・・・
set session sql_mode='STRICT_ALL_TABLES';も、insert/updateにしか0除算エラーにしてくれないらしく困っています。
なにかselectでエラーとして中止させる良い方法は無いでしょうか。
select 1/count(*) from hoge;
として、レコード0の場合もエラーになりません・・・
set session sql_mode='STRICT_ALL_TABLES';も、insert/updateにしか0除算エラーにしてくれないらしく困っています。
なにかselectでエラーとして中止させる良い方法は無いでしょうか。
>>85
http://forums.mysql.com/read.php?99,55108,55108#msg-55108
なんかUDFつかえとかちょっとトリッキーみたい。
素直にストアド書くか、C/Perl/Javaとかで書いたほうがよさそう?
http://forums.mysql.com/read.php?99,55108,55108#msg-55108
なんかUDFつかえとかちょっとトリッキーみたい。
素直にストアド書くか、C/Perl/Javaとかで書いたほうがよさそう?
>>86
ユーザ定義関数からraiseですか。
割とどんな事でもクエリが落ちない仕様っていうのは、mysqlの利点にもなってるのでしょうね・・・
>素直にストアド書くか、C/Perl/Javaとかで書いたほうがよさそう?
ですねぇ。
ありがとうございました。
ユーザ定義関数からraiseですか。
割とどんな事でもクエリが落ちない仕様っていうのは、mysqlの利点にもなってるのでしょうね・・・
>素直にストアド書くか、C/Perl/Javaとかで書いたほうがよさそう?
ですねぇ。
ありがとうございました。
これはどういう意味?組み合わせアルゴリズムってjoinの事?
http://dev.mysql.com/doc/refman/5.1/ja/view-restrictions.html
組合せアルゴリズムを使用して処理されたビューに、
インデックスを使うことは可能です。
しかし、誘導可能なアルゴリズムで処理されたビューは、
その背後にあるテーブルのインデックスを活用することができません
( 一時テーブルの作成中にインデックスを使用することはできます ) 。
http://dev.mysql.com/doc/refman/5.1/ja/view-restrictions.html
組合せアルゴリズムを使用して処理されたビューに、
インデックスを使うことは可能です。
しかし、誘導可能なアルゴリズムで処理されたビューは、
その背後にあるテーブルのインデックスを活用することができません
( 一時テーブルの作成中にインデックスを使用することはできます ) 。
userテーブルにprofileフィールドやareaフィールドやcategoryフィールドがあったとして
3つ全て別のテーブルへの参照だったとする
この場合、それら3つのフィールドへの全文検索を行うにはどうするか?
正規化したらindex使えなくなるとか無いだろ・・・
他のRDBMSはビューに対してインデックス張れたり
オプティマイザがもっと賢かったりインデックスが強力だったり
こういうところで躓かない高機能さがある
3つ全て別のテーブルへの参照だったとする
この場合、それら3つのフィールドへの全文検索を行うにはどうするか?
正規化したらindex使えなくなるとか無いだろ・・・
他のRDBMSはビューに対してインデックス張れたり
オプティマイザがもっと賢かったりインデックスが強力だったり
こういうところで躓かない高機能さがある
たぶん最善案はprofile,area,category全部に個別に全文インデックス張って
3つサブクエリ発行して積集合を求める方法
他のRDBMSの3倍+α(積集合負荷)の処理時間になりそう
あー
3つサブクエリ発行して積集合を求める方法
他のRDBMSの3倍+α(積集合負荷)の処理時間になりそう
あー
積集合じゃなくて和集合じゃないか?
オプティマイザがタコいのには狂おしいほど同意するけど
オプティマイザがタコいのには狂おしいほど同意するけど
と言うか、結合後のテーブルに対してインデックス出来ないとダメ
テーブルをまたいだインデックスを張れるか、
ビューに対してインデックスを張れないといけない
MySQLには探したところそういった機能は無い(代替になるようなものも)
正規化を崩してパフォーマンスを求める場合がある、と言われる典型的な例だと思う。
MySQLではareaテーブルとか作っちゃいけないんだよ。
テーブルをまたいだインデックスを張れるか、
ビューに対してインデックスを張れないといけない
MySQLには探したところそういった機能は無い(代替になるようなものも)
正規化を崩してパフォーマンスを求める場合がある、と言われる典型的な例だと思う。
MySQLではareaテーブルとか作っちゃいけないんだよ。
昔からある問題のはずなのに未だ解決されてないところを見ると
MySQL自体使わないほうが良いと思ったわ
開発停滞してるだろこれ
MySQL自体使わないほうが良いと思ったわ
開発停滞してるだろこれ
MySQLって確かC言語(笑)で実装されてるよね
そりゃ開発も停滞するわ
そんなもん普及させるなよな・・・
そりゃ開発も停滞するわ
そんなもん普及させるなよな・・・
いや、Cなら普通では。PostgreSQLもCですよ?
MySQLはCとC++のハイブリッド。
ソースを見てグローバル変数のすさまじい数に絶望するといいよ!
MySQLはCとC++のハイブリッド。
ソースを見てグローバル変数のすさまじい数に絶望するといいよ!
できた
mysql> update q99 set col2 = (select ename from emp where empno = 7788);
Query OK, 1 row affected (0.15 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from q99;
+------+-------+
| col1 | col2 |
+------+-------+
| 1 | scott |
+------+-------+
1 row in set (0.00 sec)
mysql> update q99 set col2 = (select ename from emp where empno = 7788);
Query OK, 1 row affected (0.15 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from q99;
+------+-------+
| col1 | col2 |
+------+-------+
| 1 | scott |
+------+-------+
1 row in set (0.00 sec)
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
みんなの評価 : ☆類似してるかもしれないスレッド
- MySQL 総合 Part12 (1001) - [94%] - 2008/1/30 17:34 ○
- MySQL 総合 Part25 (947) - [94%] - 2017/6/18 6:30
- MySQL 総合 Part13 (996) - [94%] - 2008/6/10 21:02 ☆
- MySQL 総合 Part14 (1001) - [94%] - 2008/11/23 10:17 ☆
- MySQL 総合 Part17 (1001) - [94%] - 2010/6/10 20:47 ○
- MySQL 総合 Part18 (986) - [94%] - 2011/1/17 15:46
- MySQL 総合 Part19 (982) - [94%] - 2011/6/9 2:33
- MySQL 総合 Part26 (860) - [89%] - 2023/2/2 9:30
- MySQL 総合 Part20 (995) - [89%] - 2011/10/17 4:48
- MySQL 総合 Part21 (1001) - [89%] - 2011/12/25 22:16
- MySQL 総合 Part22 (1001) - [89%] - 2012/7/10 16:45
- MySQL 総合 Part23 (992) - [89%] - 2013/8/11 17:00
- MySQL 総合 Part24 (1010) - [89%] - 2015/2/14 4:46
- MySQL vs PostgreSQL Part2 (941) - [31%] - 2022/5/26 1:30 ○
トップメニューへ / →のくす牧場書庫について