私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレMySQL 総合 Part17

みんなの評価 : ○
レスフィルター : (試験中)
>>50
ウチでちょっと前にやってみた時は、
レコード500万、テーブルサイズ約300MB(可変長時)、約800MB(固定長時)のテーブルで、
正味、プライマリーキー(int型)に対する検索だけでははほぼ五分。
でも、一緒に引いてくるカラムがvarcharの時とcharの時で、後者が方が約10%程度早かった。
ちなみにインサート時は、Load Data Infile ではこれまたほぼ五分だけど、
一行ごとのインサートや、後からAlter table等でIndexの追加、変更なんかをした時は、
固定長の方が5%前後早かった。
まああくまで自前の環境と自前のデータでちょっとやってみただけなので、他環境のことは知らない。
自分的には、ファイルサイズ三倍弱で、この程度のパフォーマンスUpだと割りに合わないと感じたので、
可変長に戻した。あとは自分でやってみて判断してくれ、としか言えない。
ウチでちょっと前にやってみた時は、
レコード500万、テーブルサイズ約300MB(可変長時)、約800MB(固定長時)のテーブルで、
正味、プライマリーキー(int型)に対する検索だけでははほぼ五分。
でも、一緒に引いてくるカラムがvarcharの時とcharの時で、後者が方が約10%程度早かった。
ちなみにインサート時は、Load Data Infile ではこれまたほぼ五分だけど、
一行ごとのインサートや、後からAlter table等でIndexの追加、変更なんかをした時は、
固定長の方が5%前後早かった。
まああくまで自前の環境と自前のデータでちょっとやってみただけなので、他環境のことは知らない。
自分的には、ファイルサイズ三倍弱で、この程度のパフォーマンスUpだと割りに合わないと感じたので、
可変長に戻した。あとは自分でやってみて判断してくれ、としか言えない。
amebaの開発者が書いたmysqlの本だかに、
結局IO周りでボトルネックになるからvarcharのほうがいいよって書かれてた気が。
結局IO周りでボトルネックになるからvarcharのほうがいいよって書かれてた気が。
>>53
テーブル構成はこんな感じ
(c1 int(10) unsigned,
c2 varchar(32),
c3 varchar(128),
primary key(c1) )CHARSET=ASCII
なんのデータなのかは想像におまかせします・・(w)。
>>52
そう、そのことも念頭にあったので、datadirをRamdisk上に配置して、
さらにmysqld起動直後に、インデックスとテーブル両方メモリキャッシュに
読見込んだ上でやってみた結果が>>51。
いろいろやってみて面白かったのは、select * from と select c1,c2,c3 で取った時は、
可変、固定ともに差が出ないのに、select c2,c3 とか、select c1,c3 とか、select c3 とか
の時は、固定長の方が明らかに優位があった(最大で10%程度)(まあ予想通りっちゅやそうだが)。
あと、c2をインデックス化して、where c2 = ** の時も、固定長の方が早かった(これはようわからん)。
上のパターンでは、ファイルサイズで大体予想つくと思うが、可変時で1レコード当たり約60byte程度、
固定長ではレコードあたり約160byteなので、容量が実用量の2.5倍以上になる。
予想としては、varcharカラムが多くて、且つ avg(length()) の割合が高ければ高いほど、
固定長にする値打ちが上がって来るように思う。
逆に、実容量がカラム定義より少なく、且つメモリに乗らないくらい大きくなればなるほど、
可変長の方が有利になるんでないかな。
テーブル構成はこんな感じ
(c1 int(10) unsigned,
c2 varchar(32),
c3 varchar(128),
primary key(c1) )CHARSET=ASCII
なんのデータなのかは想像におまかせします・・(w)。
>>52
そう、そのことも念頭にあったので、datadirをRamdisk上に配置して、
さらにmysqld起動直後に、インデックスとテーブル両方メモリキャッシュに
読見込んだ上でやってみた結果が>>51。
いろいろやってみて面白かったのは、select * from と select c1,c2,c3 で取った時は、
可変、固定ともに差が出ないのに、select c2,c3 とか、select c1,c3 とか、select c3 とか
の時は、固定長の方が明らかに優位があった(最大で10%程度)(まあ予想通りっちゅやそうだが)。
あと、c2をインデックス化して、where c2 = ** の時も、固定長の方が早かった(これはようわからん)。
上のパターンでは、ファイルサイズで大体予想つくと思うが、可変時で1レコード当たり約60byte程度、
固定長ではレコードあたり約160byteなので、容量が実用量の2.5倍以上になる。
予想としては、varcharカラムが多くて、且つ avg(length()) の割合が高ければ高いほど、
固定長にする値打ちが上がって来るように思う。
逆に、実容量がカラム定義より少なく、且つメモリに乗らないくらい大きくなればなるほど、
可変長の方が有利になるんでないかな。
varchar(300)で済むカラムをvarchar(65534)にすると、なにかデメリットってありますか?
実質、使用容量もシーク時間も変わらないのでは? と思ってしまうのですが
バージョンは5系です。
実質、使用容量もシーク時間も変わらないのでは? と思ってしまうのですが
バージョンは5系です。
>>57
了解です。どーも。
>Innodbはテーブルの格納の仕方がかなり違うみたいだし。
InnoDBはけっこう冗長だそうなんで
完全に別として、MEMORYだったりは
するかも、とちょっとおもてた。
了解です。どーも。
>Innodbはテーブルの格納の仕方がかなり違うみたいだし。
InnoDBはけっこう冗長だそうなんで
完全に別として、MEMORYだったりは
するかも、とちょっとおもてた。
どうやら、OSのリソースリークをMySQLが誘発してるっぽいんですが、
過去事例とかご存知の方いらっしゃいませんか。
過去事例とかご存知の方いらっしゃいませんか。
マルチポストっぽいが、誘導されてここに来ました。
ネットワークエンジニアなんだが、昨日、会社からデータベーススペシャリストの
資格取れと言われた。
MySQLからはじめようと思うのだが、MySQLの良い基本書はないかな?
できればコマンドラインからの入力から説明している基本書がいい。
Webの説明は見にくいのが辛い…。
ネットワークエンジニアなんだが、昨日、会社からデータベーススペシャリストの
資格取れと言われた。
MySQLからはじめようと思うのだが、MySQLの良い基本書はないかな?
できればコマンドラインからの入力から説明している基本書がいい。
Webの説明は見にくいのが辛い…。
>>61
資格を取るのが目的なら、その資格の参考書買って勉強するのが一番てっとり早い
資格を取るのが目的なら、その資格の参考書買って勉強するのが一番てっとり早い
俺が手元に置いてんのは
MySQLコマンドブック
インストールから関数の解説までは一通り載っている。
入力についてもmysqlコマンドラインでの説明もある。
けどMySQLで資格と言っても…w
MySQLコマンドブック
インストールから関数の解説までは一通り載っている。
入力についてもmysqlコマンドラインでの説明もある。
けどMySQLで資格と言っても…w
>>55
のことも教えてください><
のことも教えてください><
myisamで起こるロックについて質問させてください。
現在ちょっと重たいSELECTを発行しています。
すると他のselect文もロックされてしまいます。
> 5924480 wp 192.168.xxx.xxx:63080 wordpress Killed 9533 Sending data SELECT count(*) FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
> INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) WHERE 1=1 AND wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id IN ('22407',........)
> 5924495 wp 192.168.xxx.xxx:63105 wordpress Query 9532 Locked SELECT count(*) FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
> INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) WHERE 1=1 AND wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id IN ('91717')
http://blogs.sun.com/takemura/entry/myisam%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%AB%E3%83%AC%E3%83%B3%E3%83
%88%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
> MyISAMは皆さんご存知のように、テーブルレベルのロックのみで行レベルでのロックがサポートされていません。MySQLではSELECTコマンドの実行時に暗黙的リードロック(Shared Read lock)がかかるようになっており、
一般的にはこのロックが対象のテーブルに存在している場合には、書き込み処理(INSERT,UPDATE,DELETE,ALTER TABLEなど)がロック待ちとなります。SELECTの実行が完了してからINSERTなどが実行される形になります。
この辺があやしいのかとも思うのですが、
> 書き込み処理(INSERT,UPDATE,DELETE,ALTER TABLEなど)がロック待ちとなります。SELECTの実行が完了してからINSERTなどが実行される形になります。
とあるので、selectがロックする->updateがロックされる->selectがロックされる
となるのかな、と思ってるのですが原因と断定できず困っています。
この辺のことを詳しく書いてあるようなサイト・書籍・キーワードなどを探しています。教えてもらえませんか?
現在ちょっと重たいSELECTを発行しています。
すると他のselect文もロックされてしまいます。
> 5924480 wp 192.168.xxx.xxx:63080 wordpress Killed 9533 Sending data SELECT count(*) FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
> INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) WHERE 1=1 AND wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id IN ('22407',........)
> 5924495 wp 192.168.xxx.xxx:63105 wordpress Query 9532 Locked SELECT count(*) FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
> INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) WHERE 1=1 AND wp_term_taxonomy.taxonomy = 'category' AND wp_term_taxonomy.term_id IN ('91717')
http://blogs.sun.com/takemura/entry/myisam%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%AB%E3%83%AC%E3%83%B3%E3%83
%88%E3%82%A4%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%88%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
> MyISAMは皆さんご存知のように、テーブルレベルのロックのみで行レベルでのロックがサポートされていません。MySQLではSELECTコマンドの実行時に暗黙的リードロック(Shared Read lock)がかかるようになっており、
一般的にはこのロックが対象のテーブルに存在している場合には、書き込み処理(INSERT,UPDATE,DELETE,ALTER TABLEなど)がロック待ちとなります。SELECTの実行が完了してからINSERTなどが実行される形になります。
この辺があやしいのかとも思うのですが、
> 書き込み処理(INSERT,UPDATE,DELETE,ALTER TABLEなど)がロック待ちとなります。SELECTの実行が完了してからINSERTなどが実行される形になります。
とあるので、selectがロックする->updateがロックされる->selectがロックされる
となるのかな、と思ってるのですが原因と断定できず困っています。
この辺のことを詳しく書いてあるようなサイト・書籍・キーワードなどを探しています。教えてもらえませんか?
>>69
ありがとうございます!
ありがとうございます!
>>65
ぶっちゃげRDBMSはPostgreSQL、教科書は増永先生などの基礎論のを
一冊買って勉強した方が良い。
標準SQLの対応としてはPostgreSQLの方が一日の長があるし、正規化
も数学的に大変クリアな概念なので一度ちゃんとした教科書できちんと
した理屈付けや定義は見ておいた方が良い。
遠回りに見えるかもしれないけど標準SQLも関係代数もつぶしがきく
知識なので絶対に無駄にはならないと思うよ。
ぶっちゃげRDBMSはPostgreSQL、教科書は増永先生などの基礎論のを
一冊買って勉強した方が良い。
標準SQLの対応としてはPostgreSQLの方が一日の長があるし、正規化
も数学的に大変クリアな概念なので一度ちゃんとした教科書できちんと
した理屈付けや定義は見ておいた方が良い。
遠回りに見えるかもしれないけど標準SQLも関係代数もつぶしがきく
知識なので絶対に無駄にはならないと思うよ。
質問させてください。板違いなら誘導おねがいします。
質問◆MySQLをインストールする前の状態にするにはどうしたらいいのでしょうか。
経緯◆データベースの勉強のためLAN内のサーバ(CentOS5.4)に、PC上のsshクライアントから
yumでインストールしました。
# rpm -qa mysql
mysql-5.0.77-3.el5
# rpm -qa mysql-server
mysql-server-5.0.77-3.el5
# rpm -qa perl-DBD-MySQL
perl-DBD-MySQL-3.0007-2.el5
# rpm -qa php-mysql
php-mysql-5.1.6-23.2.el5_3
ところが初回起動時、自分が意図しないパスワードを設定したらしく(※)下記のエラーで立ちあがりません。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
そこで、権限無視モードで立ち上げる方法を検索して起動しました。
# /etc/init.d/mysqld start --skip-grant-tables
MySQL を起動中: [ OK ]
しかし
# mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
となってしまいました。
クライアントが無事起動したら
UPDATE mysql.user SET password=PASSWORD('password') WHERE user='root'; とするつもりでした。
(ちなみに「# mysqladmin -u root」は大量の情報を吐いたあとrootプロンプトにもどってしまいました。
また 「$ mysql」 一般ユーザでは立ち上がります)
# yum remove mysql
Erasing : mysql 1/4
Erasing : php-mysql 2/4
Erasing : perl-DBD-MySQL 3/4
Erasing : mysql-server 4/4
Complete!
と削除したあと、またインストールしてみましたが同じ結果でした。サーバのコンソールからもやりましたが同様でした。
どうやらパスワードリセットの方法は使えないようなので、MySQLをインストールする前の状態にしたいのです。
(※)自分が意図しないパスワードを設定したというのは、sshクライアントの画面の内容を保存しておこうと、大量の文字をコピーした
んですが、それをsshに貼ってしまったのです!なかなかプロンプトが帰ってこず、Ctrl+Cをしたら画面には Clean up... と出ていました…。
なにかをClean up中にCtrl+Cしてしまったわけです。
よき解決策をご教示いただければ大変にたすかります。
よろしくおねがいいたします。
質問◆MySQLをインストールする前の状態にするにはどうしたらいいのでしょうか。
経緯◆データベースの勉強のためLAN内のサーバ(CentOS5.4)に、PC上のsshクライアントから
yumでインストールしました。
# rpm -qa mysql
mysql-5.0.77-3.el5
# rpm -qa mysql-server
mysql-server-5.0.77-3.el5
# rpm -qa perl-DBD-MySQL
perl-DBD-MySQL-3.0007-2.el5
# rpm -qa php-mysql
php-mysql-5.1.6-23.2.el5_3
ところが初回起動時、自分が意図しないパスワードを設定したらしく(※)下記のエラーで立ちあがりません。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
そこで、権限無視モードで立ち上げる方法を検索して起動しました。
# /etc/init.d/mysqld start --skip-grant-tables
MySQL を起動中: [ OK ]
しかし
# mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
となってしまいました。
クライアントが無事起動したら
UPDATE mysql.user SET password=PASSWORD('password') WHERE user='root'; とするつもりでした。
(ちなみに「# mysqladmin -u root」は大量の情報を吐いたあとrootプロンプトにもどってしまいました。
また 「$ mysql」 一般ユーザでは立ち上がります)
# yum remove mysql
Erasing : mysql 1/4
Erasing : php-mysql 2/4
Erasing : perl-DBD-MySQL 3/4
Erasing : mysql-server 4/4
Complete!
と削除したあと、またインストールしてみましたが同じ結果でした。サーバのコンソールからもやりましたが同様でした。
どうやらパスワードリセットの方法は使えないようなので、MySQLをインストールする前の状態にしたいのです。
(※)自分が意図しないパスワードを設定したというのは、sshクライアントの画面の内容を保存しておこうと、大量の文字をコピーした
んですが、それをsshに貼ってしまったのです!なかなかプロンプトが帰ってこず、Ctrl+Cをしたら画面には Clean up... と出ていました…。
なにかをClean up中にCtrl+Cしてしまったわけです。
よき解決策をご教示いただければ大変にたすかります。
よろしくおねがいいたします。
>>76
rm -rf /var/lib/mysql/*
/usr/bin/mysql_install_db
以上。
mysql_install_dbは、mysql-serverパッケージに含まれてる。
rm -rf /var/lib/mysql/*
/usr/bin/mysql_install_db
以上。
mysql_install_dbは、mysql-serverパッケージに含まれてる。
WinXP + MySQL5.1.41
optimize について教えてください。mysqlで以下のメッセージが出ました。対象テーブルはInnoDBです。
mysql> optimize table ***;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.*** | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.*** | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set
Optimizeではなく テーブルを再作成してAnalizeを代わりに使えって言ってるみたいですけど、
InnoDBはOptimizeをサポートしていないんですか?
optimize について教えてください。mysqlで以下のメッセージが出ました。対象テーブルはInnoDBです。
mysql> optimize table ***;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.*** | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.*** | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set
Optimizeではなく テーブルを再作成してAnalizeを代わりに使えって言ってるみたいですけど、
InnoDBはOptimizeをサポートしていないんですか?
問題は無い…という風に理解してよろしいのでしょうか?
>>82
よろしいです
よろしいです
NULL と 0 が同義に扱われてると知らなかったのですが、
値が正確に NULL か 0 かを評価することってできないのでしょうか?
やりたいことは、
+----------+
| num | data |
+----------+
| 0 | A |
| 1 | B |
| NULL | C |
+----------+
ここでフィールド num の値が 0 以外のものをすべて SELECT で抽出したいのです。
(表の場合だと B と C のレコードだけ取りだしたい)
以下では 0 が NULL と扱われているようで、うまくいきませんでした。
SELECT * FROM tbl_name WHERE num != 0 ×
SELECT * FROM tbl_name WHERE num + 1 != 1 ×
詳しい方教えていただけないでしょうか。
値が正確に NULL か 0 かを評価することってできないのでしょうか?
やりたいことは、
+----------+
| num | data |
+----------+
| 0 | A |
| 1 | B |
| NULL | C |
+----------+
ここでフィールド num の値が 0 以外のものをすべて SELECT で抽出したいのです。
(表の場合だと B と C のレコードだけ取りだしたい)
以下では 0 が NULL と扱われているようで、うまくいきませんでした。
SELECT * FROM tbl_name WHERE num != 0 ×
SELECT * FROM tbl_name WHERE num + 1 != 1 ×
詳しい方教えていただけないでしょうか。
>>84
了解しました m(_ _)m
了解しました m(_ _)m
>>86
ありがとうございます!
ありがとうございます!
>>90
一回外部キー制約自体を削除して新たに制約をALTERするのじゃだめですか?
一回外部キー制約自体を削除して新たに制約をALTERするのじゃだめですか?
>>91
それで大丈夫でした。ありがとうございました。こうやってやるんですね。
それで大丈夫でした。ありがとうございました。こうやってやるんですね。
>>94
状況不明。
手順をもっと具体的に。
推測できる問題は、ターミナル、MySQL
クライアントの文字エンコーディングの
設定か?
ちなみに、ちゃんとした環境だったら、
\とかいちいち気にしなくてもいいはず。
状況不明。
手順をもっと具体的に。
推測できる問題は、ターミナル、MySQL
クライアントの文字エンコーディングの
設定か?
ちなみに、ちゃんとした環境だったら、
\とかいちいち気にしなくてもいいはず。



類似してるかもしれないスレッド
- MySQL 総合 Part12 (1001) - [94%] - 2008/1/30 17:34 ○
- MySQL 総合 Part13 (996) - [94%] - 2008/6/10 21:02 ☆
- MySQL 総合 Part14 (1001) - [94%] - 2008/11/23 10:17 ☆
- MySQL 総合 Part15 (1001) - [94%] - 2009/4/20 12:15 ☆
- 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 総合 Part25 (947) - [89%] - 2017/6/18 6:30
- MySQL vs PostgreSQL Part2 (941) - [31%] - 2022/5/26 1:30 ○
トップメニューへ / →のくす牧場書庫について