MySQL 総合 Part18

このエントリーをはてなブックマークに追加
1NAME IS NULL
オラクル社製(予定)RDBMS、MySQL の総合スレです。
MySQL 総合 Part15(16) http://pc11.2ch.net/test/read.cgi/db/1240291265/
[関連スレと過去ログ]
http://find.2ch.net/index.php?STR=MySQL
http://makimo.to/cgi-bin/search/search.cgi?D=db&q=MySQL&sf=0&link2ch=on
MySQL 総合 Part17
http://pc11.2ch.net/test/read.cgi/db/1258928470/

[MySQL Developer Zone] http://dev.mysql.com/
[MySQL 日本語リファレンスマニュアル] http://dev.mysql.com/doc/refman/5.1/ja/index.html
[MySQL Internals Manual] http://dev.mysql.com/doc/internals/en/

[MyNA] http://www.mysql.gr.jp/
[MLja] http://lists.mysql.com/mysql-ja

ここで質問をする前に、MyNAでのFAQを最初に確認しましょう。
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
MyNAでの「心得の条」
http://www.mysql.gr.jp/frame/modules/bwiki/index.php?%BB%A8%B3%D8%2F%BF%B4%C6%C0

・関連ツール及びユーティリティ
・関連書籍
>>2
2NAME IS NULL:2010/06/11(金) 18:17:30 ID:CZ3w74oP
【関連ツール及びユーティリティ】

[phpMyAdmin] http://www.phpmyadmin.net/
[phpMyBackupPro] http://www.phpmybackuppro.net/
[MySQLCC] http://www.mysql.com/products/mysqlcc/
[MySQL-Front] http://www.mysqlfront.de/
[mytop] http://jeremy.zawodny.com/mysql/mytop/
[Common SQL Environment] http://www.hi-ho.ne.jp/tsumiki/cse_1.html

MySQL ABでの各種GUIツールはMySQL GUI Toolsとして統合されています
(WorkbenchはGUI Toolsから独立しました。)
http://dev.mysql.com/downloads/gui-tools/5.0.html
・MySQL Administrator
・MySQL Query Browser
・MySQL Migration Toolkit

http://dev.mysql.com/downloads/gui-tools/5.0.html#Workbench
・MySQL Workbench

【関連書籍】

[MySQL Books]
http://dev.mysql.com/books/
http://www.amazon.co.jp/exec/obidos/search-handle-url/ix=books-jp&fqp=keywords%01MySQL
http://www.amazon.co.jp/exec/obidos/search-handle-url/ix=books-us&fqp=keywords%01MySQL
3NAME IS NULL:2010/06/11(金) 23:58:21 ID:OgUYaDz6
DATE型で登録しているカラム(date:2010-06-12)を
2010-06の形にして結合したいと思い、以下のようにしました。

LEFT JOIN test_tb ON
main_tb.DATE_FORMAT(date,'%Y-%m')=test_tb.DATE_FORMAT(date,'%Y-%m')

しかし、エラーになりました。DATE型を変換して結合する事は出来ないのでしょうか?
4NAME IS NULL:2010/06/12(土) 03:19:34 ID:???
まずSELECT文で2010-06の形に表示できないでしょ君
5NAME IS NULL:2010/06/12(土) 06:52:58 ID:???
こっこれは>>1乙じゃないなんたらかんたら
6NAME IS NULL:2010/06/13(日) 00:38:09 ID:n4WAyuno
ついにHPにオラクルのロゴが・・・
健全なDBの発展にとって、障害にならないことを祈るよ。
7NAME IS NULL:2010/06/13(日) 01:45:05 ID:???
SunだけじゃなくてHPもか。
8NAME IS NULL:2010/06/13(日) 02:34:52 ID:LooQN1pa
MySQLはやはりこれから衰退するのかな?
9NAME IS NULL:2010/06/13(日) 23:30:30 ID:6Ht8+KIJ
MySQL workbentchで複合キーを設定するにはどうすればよいのでしょうか?
10NAME IS NULL:2010/06/14(月) 16:20:21 ID:???
複数のテーブルをJOINして抽出しています。
データ量が増えるほど抽出に時間がかかるようになりました。

JOINには各テーブルでPRIMARYに指定しているカラムで連結していますが、
このPRIMARYに指定しているカラムにもINDEXを作成した方がいいのでしょうか?
phpMyAdminでそれを行うと、同じものだからどちらかを削除するように、
とワーニングが表示されます。

11NAME IS NULL:2010/06/14(月) 16:36:25 ID:???
主キーには自動的にインデックスが作成される
12NAME IS NULL:2010/06/14(月) 18:19:37 ID:zkQpRMhb
設計に関して相談です。

野球とかサッカーとかチーム名を保存するテーブルがあったとして、
それぞれの目的毎にテーブルを分けますか?それとも
id | name | type |
1 巨人 野球
2 阪神 野球
3 ジュビロ サッカー

みたいに、1つのテーブルでまとめますか?
フィールドがジャンル毎に異なるので、今現時点では分けているのですが、
野球とかサッカーとかチーム名の場合、多くても100レコードほどなので
1つにまとめても良いのではないか?と思っています。

そこで皆さんはどうされているか気になる、質問させていただきました。
13NAME IS NULL:2010/06/14(月) 18:24:22 ID:zkQpRMhb
最終行、間違っていました。「気になる → 気になり」です。

あと、要件として「各チームのファン(会員)」情報も登録させたいと思っています。
現在は、baseball_userとかsoccer_userとかそれぞれ会員テーブルを作って
会員情報を保存しているのですが、これもuserという一つのテーブルに
まとめても良いんじゃないか?とも思っています。

どちらの方が管理しやすいか、先が見えないので悩んでいます。
14NAME IS NULL:2010/06/14(月) 18:47:44 ID:???
「チーム名を」保存するテーブル、言ってみればチーム名マスタなんでしょ?
なんでtypeなんてカラムがあるの? とか思ってしまう。

だからと言って、種目ごとにテーブル分けれって意味でもない。
例えば
チーム名テーブル
id | name
1 巨人
2 阪神
3 ジュビロ

チーム:種目テーブル
id|type
1 1
2 1
3 2

種目名テーブル
id|name
1 野球
2 サッカー

と、多分教科書通りならこうなる。

先々扱う種目が増えるたびにテーブル自体増やすって
あんまりやりたくないし。
1512:2010/06/14(月) 19:35:32 ID:zkQpRMhb
>>14
ありがとうございます。typeに分けたのは
それほど種目の数が多く無いと思ったので。
一覧出力する時にJOINするよりも良いかな?って思いました。

では、種目毎の会員にしたい場合はどうするんでしょうか?
id|種目id|name|sex
1 1 aaa 男
2 1 bbb 女
3 2 aba 男

みたいに一つのテーブルにまとめる考え方で良いのでしょうか?
16NAME IS NULL:2010/06/14(月) 20:05:17 ID:???
id|name|sex
1 aaa M
2 bbb F
3 aba M

id|team-id
1 1
1 2
2 3
3 3
1712:2010/06/14(月) 20:55:11 ID:zkQpRMhb
>>16
すみません、後半が全く意味が分からないです。なぜこうしているのかが・・・
18NAME IS NULL:2010/06/14(月) 22:40:03 ID:On6ImGJg
alter table version add foreign key (package_id) references package.id

versionテーブルのpackage_idの外部キーを設定したいんですが、
このsqlを実行してもなぜかpackage.idにない列も登録できます

なぜですか?
19NAME IS NULL:2010/06/16(水) 18:18:35 ID:j/mUMttm
検索が、遅いので プロファイリングしたら、

system lock で 8秒ほど時間がかかっているので system lock を調べてみると

System lock スレッドが、テーブルの外部システムロックを待っている。同じテーブルにアクセスする複数の mysqld サーバを使用していない場合、--skip-external-locking オプションでシステムロックを無効にできる。

との記載が、「同じテーブルにアクセスする複数の mysqld サーバを使用していない」という条件があるのですが。

私の環境は 1台のDBサーバーで、mysqldを動かしています、ポート変えてmysqldとかは動かしていません。
DBサーバーへな、複数のクライアントPCがつながっています。
DBサーバのデータは、iscsiを使用して、マウントしています。

DBサーバには、mysqldが1個しか動いていないので、System lock を無効にしても問題はないのでしょうか?

また、my.cnfで system lock を無効にすることは可能なのでしょうか?

クレクレで申し訳ないのですがお教えいただければ幸いです。
20NAME IS NULL:2010/06/17(木) 07:55:24 ID:???
そのなかではiSCSIがいちばんあやしい
21NAME IS NULL:2010/06/17(木) 13:21:53 ID:???
skip-external-lockingと、my.cnfに書けばよい。
22NAME IS NULL:2010/06/18(金) 16:27:54 ID:u1aWXxS0
CREATE ROUTINE権限付与の質問です。

MySQL5.0.41
バイナリログ有効
hogeユーザーにSUPER権限を付与済み

上記環境で以下のステートメントを実行

mysql>grant create routine on *.* to hoge@localhost identified by '********';

しかしhogeユーザーの権限にcreate routineが追加されていない…
mysql.userテーブルの項目を見たら、create_routine_privの項目が無い…
だけど、rootユーザーにはinfomation_schema.USER_PRIVILEGESテーブルに

GRANTEE → 'root'@'localhost'
PRIVILEGE_TYPE → CREATE_ROUTINE

↑このデータが登録されている。
GRANT ALL PRIVILEGES〜でrootユーザーは権限定義されている模様。
もしかしてcreate_routine_priv項目が無いって事は
MySQLがアップグレードされていない?

それとも他に原因があるのでしょうか?
ご教授願います。
23NAME IS NULL:2010/06/18(金) 18:45:58 ID:???
これ見てよ↓
http://livedoor.blogimg.jp/tekepo/imgs/3/4/3414dfca.jpg
ばらまこうぜ!
24NAME IS NULL:2010/06/19(土) 02:30:01 ID:pO5pEHhw
mysql初心者です。

特定の人物を出力したい
select name from testdb where name like '_藤%';

メアドがnullの人物を検索したい
select name from testdb where mailladd is null;

上記のようなパターンで、[_]と[is null]を使うと
「Empty set」になるのはインストールミスなんでしょうか?
like文に関しては'%藤%'では問題なく出力されます。
nullに関しても、testdbに問題は見られません。

とても初歩的な問題かもしれませんが、答えがわかる方いましたらよろしくお願いします。

実行環境 winxpsp3 mysql5.1
実行権限 root
25NAME IS NULL:2010/06/19(土) 05:47:26 ID:???
'%藤%'のSELECT結果を貼ってもらえれば
何か分かるかもしれない
26NAME IS NULL:2010/06/19(土) 09:23:29 ID:uc4dA5J7
mysql初心者です。
mysqlコマンドとmysqldumpについて質問です。
mysqlの実行結果をmysqldumpのwhereに用いるにはどのようにすればよいでしょうか?

下記のように、entryテーブルのentry_dateからentry_idを絞り込み、
そのentry_idを持つレコードをentry_dataテーブルからmysqldumpしたいです。

FROM=`date -d "1 weeks ago" +"%Y-%m-%d %k:%M:%S"`;
TO=`date +"%Y-%m-%d %k:%M:%S"`;
mysql --user=fugafuga --password=piyopiyo hogehoge <<EOF
SELECT entry_id FROM entry WHERE entry_date BETWEEN "$FROM" and "$TO";
EOF

mysqldump hogehoge -u fugafuga --password=piyopiyo entry_data "--where=entry_idが上記の結果に含まれる"

よろしくお願いします。
27NAME IS NULL:2010/06/19(土) 11:09:19 ID:???
FROM=`mysql -u scott -pXXXXX scott -B -N -e 'select ename from emp where empno = 7788'`
とか。

ただやりたいことを想像するに
SELECT INTO OUTFILEとLOAD DATA LOCAL INFILEの方が
便利ではないかと思われます。
28NAME IS NULL:2010/06/19(土) 12:44:20 ID:pO5pEHhw
>>25
回答いただきありがとうございます。
現在も同じ状況なので、引き続き質問させていただきます。

>'%藤%'のSELECT結果を貼ってもらえれば
>何か分かるかもしれない
参考になればと思い、いくつかパターンをはらせていただきました。
'%藤%'の出力結果
+--------+
name
+--------+
加藤二郎
内藤五郎
+--------+

'_藤%'&'?藤%'の出力結果の出力結果
'____'&'_%__'も同じ結果です。
Empty set


情報処理の教科書そのまま使っているのでDB全体は割合しますが、1郎〜5郎までは
苗字が違うだけです。

お時間がありましたらよろしくお願いします。


29NAME IS NULL:2010/06/19(土) 12:46:11 ID:pO5pEHhw
>>25
回答いただきありがとうございます。
現在も同じ状況なので、引き続き質問させていただきます。

>'%藤%'のSELECT結果を貼ってもらえれば
>何か分かるかもしれない
参考になればと思い、いくつかパターンをはらせていただきました。
'%藤%'の出力結果
+--------+
name
+--------+
加藤二郎
内藤五郎
+--------+

'_藤%'&'?藤%'の出力結果の出力結果
'____'&'_%__'も同じ結果です。
Empty set


情報処理の教科書そのまま使っているのでDB全体は割合しますが、1郎〜5郎までは
苗字が違うだけです。

お時間がありましたらよろしくお願いします。


30NAME IS NULL:2010/06/19(土) 13:22:57 ID:???
とりま、テーブルの文字コード指定も絡むから話が面倒だけど、
like '__藤%' だとどーなのよ
31NAME IS NULL:2010/06/19(土) 13:41:50 ID:???
なるほど。そしたら
__藤%
___藤%
の処理結果と、
show create table testdb\G
それから
show session variables like '%char%';
の結果を貼ると親切な人が教えてくれるかもしれない
32NAME IS NULL:2010/06/19(土) 13:44:17 ID:pO5pEHhw
>>30
でました!

半角英数は1文字=1バイトで、日本語は1文字=2バイト消費する。
だからアンダーバーを二つつける必要がある?という感じでしょうか…

あまりご迷惑はおかけできないので、テーブルの文字コード指定の件は
今から自分で調べてみます。

本っ当に助かりました。
ありがとうございます。
33NAME IS NULL:2010/06/19(土) 13:51:58 ID:???
MySQL 4.1以降ではアンダーバーは一つで出るのが正しい
そのままやってると何かするたびに意図どおりに動かなくて悩むぞ
今のうちに直そう
34NAME IS NULL:2010/06/19(土) 14:09:10 ID:pO5pEHhw
>>33
もう一度確認しましたが、バージョンは5.1で間違いないんです;
おそらく文字コード指定があってないのではと考え、色々探しています。

とりあえず「一つで出るのが本当は正しい」というこれからも認識は残すようにします。

重ね重ね親切にありがとうございます。
35NAME IS NULL:2010/06/19(土) 15:55:50 ID:uc4dA5J7
>>27
ご回答ありがとうございました。>>26です。

使っているのが共有サーバーで、
権限の関係でLOAD DATA INFILE構文が使えないと思っていました。

以下のように書いたところ、LOAD DATA INFILEもできたようなのですが、
間違いや危ない記述がないかチェックしていただけませんか?

■バックアップ
FROM=`date -d "1 weeks ago" +"%Y-%m-%d %k:%M:%S"`;
TO=`date +"%Y-%m-%d %k:%M:%S"`;
cd /home/hoge/hoge00001/www/admin;
/usr/local/mysql/bin/mysql --user=hoge --password=fuga piyo -e "SELECT * FROM entry_data WHERE entry_id IN (SELECT entry_id FROM entry WHERE entry_date BETWEEN \"$FROM\" and \"$TO\")" > edata.txt;

■リストア
cd /home/hoge/hoge00001/www/admin;
/usr/local/mysql/bin/mysql --enable-local-infile --user=hoge --password=fuga piyo -e "LOAD DATA LOCAL INFILE \"edata.txt\" INTO TABLE entry_data";

よろしくお願いします。
36NAME IS NULL:2010/06/19(土) 16:27:51 ID:???
LOAD DATA INFILEはFILE権限が必要だけど(mysqldがファイルを読み込む)
LOAD DATA LOCAL INFILEは権限必要ない(mysqlがファイルを読み込む)
これマメ知識

データにタブ文字や改行コードが入ってたら動かないね
無ければ別にそのままでおk

あとMySQLの場合そのSQLの書き方だと性能が悪い
SELECT * FROM entry_data WHERE entry_id
IN (SELECT entry_id FROM entry WHERE entry_date BETWEEN xx and yy)

相関関係のないINをMySQLで使ってはいけない。こう書く
SELECT * FROM entry_data ed
INNER JOIN entry e ON ed.entry_id = e.entry_id
WHERE e.entry_date BETWEEN xx AND yy

なぜ遅いかはこちら
http://nippondanji.blogspot.com/2009/03/mysql_25.html
37NAME IS NULL:2010/06/19(土) 16:40:48 ID:???
まちがえた
SELECT ed.* FROM entry_data ed
INNER JOIN entry e ON ed.entry_id = e.entry_id
WHERE e.entry_date BETWEEN xx AND yy
38NAME IS NULL:2010/06/19(土) 17:08:13 ID:uc4dA5J7
>>37
ありがとうございました。

内部結合すると内部結合した結果が
ファイルに書き込まれてしまうものと思い、
サブクエリを使ってみていたのですが、

>SELECT ed.*

なるほどです!
39NAME IS NULL:2010/06/19(土) 17:22:25 ID:+rTxija2
>>22
どなたか分かる方いましたら、お願いします。
40NAME IS NULL:2010/06/20(日) 22:42:23 ID:eV6urwv1
SELECTはすぐ終わるのに、同じWHERE句のUPDATE文が延々と終わらないMyISAMのテーブルがあって
myisamchk →usable but should be fixed
myisamchk -r →UPDATEの問題は解決せず
myisamchk -o →解決せず
って状態なんだけどどーしたらいい?
41NAME IS NULL:2010/06/20(日) 23:33:01 ID:???
mysqldumpしてリストアかな
42NAME IS NULL:2010/06/21(月) 13:48:11 ID:8qylY79Y
スゴく基本的なことを聞きます。(もちろん本やサイトで散々調べたんですが)
トランザクションてありますが、あれで クエリ1、クエリ2と2つのクエリ文を実行するとき
それぞれのクエリがエラーを起こしたらcommitされないわけですよね?

言い方を変えれば、クエリがinsertであれupdateであれ、commitされた時は
その命令が正常に完了されるわけで、いちいちinsert後にlastinsertIdをとったり、
update後にaffectedrowsをとったりして個別のクエリの結果をチェックしなくても
commit完了してさえいれば正常に処理されてると考えていいんでしょうか?

チェックする必要があるとしたら、insertで全体の行数が一定の数を超えてはいけないとかの
特別な条件がついてる場合で、insert処理後に全体行数を取得して、オーバーしてたらcommit回避するとか
そういうケースのみと考えて良いのかな?

ご意見よろしくお願いします。
43NAME IS NULL:2010/06/21(月) 13:59:05 ID:???
libmysqlclientが使ってるプロトコルをjavaで実装できないか検討してます。
理由はjavaで直にmysqlと通信したいからです。
調べた限りではなかったのですがすでにこういったjavaのクラスは公開されてるでしょうか?
実装するとしたらprotocolbufferとか使えるのでしょうか.
識者の方,ご教授ください.
44NAME IS NULL:2010/06/21(月) 14:00:20 ID:???
commitするかどうかはエラーをラップして決めるんじゃない?
php風に書くと
try {
  $dbh->beginTransaction();
  (アップデートとかの処理)
  $dbh->commit();
} catch (Exception $e) {
  $dbh->rollBack();
}

みたいな感じで、ちゃんとエラートラップしないと意味ないような気がする
45NAME IS NULL:2010/06/21(月) 14:06:41 ID:???
>>43
よくわからんけど、JDBCじゃダメな理由は?
46NAME IS NULL:2010/06/21(月) 14:29:20 ID:???
理由はかけませんが直でmysqlと通信したいのです。
47NAME IS NULL:2010/06/21(月) 14:32:20 ID:???
>>46
ならCで書いたら?
48NAME IS NULL:2010/06/21(月) 14:40:17 ID:???
Cならlibmysqlclient使います。
javaのクライアントでmysqlと直で話をしたい、JDBCは使いたくないわけです。
49NAME IS NULL:2010/06/21(月) 14:45:58 ID:???
>>48
ソケット通信でも自分で実装すればいいんじゃね?
50NAME IS NULL:2010/06/21(月) 14:48:30 ID:???
最悪、自分で全実装すればいいですが、
どこかにすでに公開されたクラスがないか、
または楽に実装できる方法があるか、たとえばprotocol bufferを使うなど、
知りたかったわけですが
51NAME IS NULL:2010/06/21(月) 14:51:06 ID:8qylY79Y
>>44
レスありがとうございます
try〜catchの形は理解出来るんだけど、その(アップデートとかの処理)の中に
たとえばinsertクエリの結果の検証(ちゃんと一行増えたかな?)とかも含めるの?
事前にチェックした行数とクエリ後のlastInsertId()の値を比較するとか。。

Mysqlの本やサイト見ても、クエリ文のすぐ下にcommit();が書いてあるばかりで
そういうチェックしてるのなんて見たことないんで軽く混乱してる。。

エラー(カラムのデータ型と送信値のデータ型の不一致とか)でクエリ失敗するとロールバックされるのは
わかるし、同様に上みたいな検証しなくても「ちゃんと一行増えない=エラー発生」の時も
ロールバックされると思ってたので、チェックの必要なんて無いのではと思ってたんだけど
どうなんだろう?
52NAME IS NULL:2010/06/21(月) 14:56:49 ID:???
>>51
insertコマンドがエラー返さなければ、暗黙の了解で成功したと見れるんじゃないの?
てかそれがbegin>commitの意味だと思うけど。
53NAME IS NULL:2010/06/21(月) 15:17:00 ID:8qylY79Y
>>52
そうですよね!? それなら良いんです、安心しました
他の人の意見ももらえたら嬉しいですが、、 ありがとう
54NAME IS NULL:2010/06/21(月) 20:30:50 ID:???
そんなの言い出したら今度は
確認用のlastInsertId()をさらにチェックするとか
始まるだろ。
やりたきゃ好きなだけやれよ。
55NAME IS NULL:2010/06/22(火) 21:27:41 ID:???
>>51
馬鹿発見
56NAME IS NULL:2010/06/22(火) 22:11:33 ID:???
複数のWebサービスから利用されているMySQLサーバを運用しているのですが、
このサーバがここ最近突然重くなりました。
大したアクセス数のあるサイトを持ってるわけでもなく朝方のような時間帯でも重いので
何か特殊な原因があるのではないかと考えて調査しているのですが検討が付きません。

topコマンドを叩くと、
load averateが平均で3〜5ぐらい、高い時で10を超えたりします。
またmysqldコマンドの%CPUの値が100%を超えて300%ぐらいになります。

ここら辺が異常なのは分かるのですが原因が分かりません。
何か考えられる原因はあるでしょうか?
57NAME IS NULL:2010/06/22(火) 22:22:02 ID:???
お前さん岡崎市立中央図書館のシステム作った会社の人か?
58NAME IS NULL:2010/06/23(水) 00:59:59 ID:???
まずはスロークエリログを設定してデータ収集して調べるところから。
59NAME IS NULL:2010/06/25(金) 00:20:39 ID:???
Workbench使おうと思っても
PW入力してコネクトしてるところから進まない
応答なしになるんだけどなんで?

mysql 5.1
bench 5.2
60NAME IS NULL:2010/06/26(土) 19:47:37 ID:TQu1MBDb
MySQL初心者です。
PHPとMySQLで音楽関係のサイトを制作しています。

artistテーブル=ジャンル、歌手名、歌手番号の3レコード
songテーブル=曲番号、曲のタイトル、曲の発表日、曲の評価、曲の冒頭の5レコード

こんなMyISAMテーブルがあり、
artistテーブルには100レコードほど( 各ジャンルごとに歌手が20種ほどあり)、
songテーブルには60000レコードほど、
「曲番号(文字列型)」というのは「歌手番号(文字列型)」の後に任意の数が付いた番号となっています。
ここから特定のジャンルに当てはまる曲を探してくる際に、

「特定のジャンル」に該当する歌手番号を取得→「歌手番号」から始まる曲番号を取得

if ( $result = $mysqli->query( 'SELECT 歌手番号 FROM artist WHERE ジャンル=特定のジャンル' ) ) {
while ( mysqli_fetch_assoc( $result ) ) { $artist_id[] = $result['歌手番号'] ; }
}
$where = "";
foreach ( $artist_id as $id ) {
$where .= '曲番号 LIKE " ' .$id . '%" OR';
}
if ( $result = $mysqli->query( 'SELECT 曲名 FROM song WHERE ' . $where .' LIMIT 100' ) {
...

のようにして検索しています。
これに6〜10秒ほどかかります。

ジャンルを絞り込まなければかなり早く結果が返ってくるので、
この長いWHERE句のいちいちレコードを比較しているのが遅い原因だと思うのですが、
これを早くするにはどのようなクエリまたはテーブル構成にすればよいでしょうか?
(ちなみに、ページ移動に6〜10秒かかるのはやっぱり遅いですよね?)

よろしくお願いします。
61NAME IS NULL:2010/06/26(土) 20:13:39 ID:???
62NAME IS NULL:2010/06/26(土) 20:15:55 ID:???
サブクエリは使わない条件なのかい?
ちなみに歌手が違うジャンルの曲を歌ったときの対応とかどうよという気がしないでもないが。
63NAME IS NULL:2010/06/26(土) 20:36:38 ID:TQu1MBDb
>>61
調べてみます

>>62
実際にはここで歌手番号と同時に歌手名も取得し、
歌手番号と歌手名の連想配列をとりあえず変数に入れておいて、
最終的にどの曲がどの歌手のものなのかを表示しているので、
サブクエリは使っていません。

歌手とジャンルの対応を言われると厳しいです。
曲といっしょにその曲のジャンルまで収集できる仕組みを作れればいいのですが、
そこがうまくいかなかったのでとりあえず歌手は特定のジャンルのみとしました。
歌手が別のジャンルの専門になったら、
歌手ごとにジャンルを変えてしまおうという感じです。
64NAME IS NULL:2010/06/26(土) 21:31:58 ID:???
>>60
曲番号を1カラムにまとめないで、歌手番号と歌手毎分類番号の2カラムで
複合主キーにしたら?
65NAME IS NULL:2010/06/26(土) 22:15:02 ID:???
>>63
>サブクエリは使っていません。 (キリッ

いや、そういうのを聞きたいわけじゃなくて、「特定のジャンル、歌手番号、歌手名、曲番号、曲名」を
1クエリで引っ張ったらいいんじゃないの?という話なんだが。
66NAME IS NULL:2010/06/26(土) 23:17:08 ID:???
ジャンルとか曲番号にindexが張られていないとかいうオチじゃねーだろーな
67NAME IS NULL:2010/06/26(土) 23:52:08 ID:TQu1MBDb
まだスロークエリログの出力方法ががよくわからないですが
日付が変わってしまうのでレスしておきます。

http://nippondanji.blogspot.com/2009/01/mysql-51.html
こちらを参考にmy.iniを書き換えたら
mysql-slowというファイルが作成されたのですが、
「Time Id Command Argument」の後に何も表示されません。
ちなみにXAMPPでWindowsXPにMySQLをインストールしました。
もし何か分かれば教えていただけると嬉しいです。

>>65
どのようにサブクエリを使えばそのような結果を得られますか?

>>66
ジャンル、曲番号にはインデックスが張ってあります。

以上、よろしくお願いします。
68NAME IS NULL:2010/06/27(日) 02:06:19 ID:???
ttp://alfalfalfa.com/archives/398564.html
ttp://www.unkar.org/read/tsushima.2ch.net/news/1277472565

MySQL嫌われ杉ワラタ
つか有償ライセンスってそんなに必要になるケースってないだろ?
69NAME IS NULL:2010/06/27(日) 07:24:28 ID:???
頭が変になりそうだ、
70NAME IS NULL:2010/06/27(日) 08:54:56 ID:???
>>67
ボトルネックは明らかにPHPでのループとインデックスの使われてないであろう曲番号LIKE検索だろう。
DB構造もロジックも両方直さないとな。
71NAME IS NULL:2010/06/29(火) 19:40:42 ID:???
テーブルの中で日々増大するテーブルがあり、
それは滅多に使わないものですが、とっておきたいデータです。

私としては定期的にダンプしてzipで圧縮後、テーブルデータを削除したいのですが、
dumpコマンドでダンプしたデータが壊れていないかどうかを確かめる方法を探しています。

私としては、dumpコマンド実行中になんらかしらの障害が発生してデータが壊れているのにも関わらず、
ダンプが終わったと判断して、テーブルデータを削除していますケースを心配しています。

全ては、定時バッチで処理したいと考えています。アドバイス宜しくお願いします。
72NAME IS NULL:2010/06/29(火) 19:41:32 ID:???
ちなみに、 MySQL5.1、InnoDBを使っています。宜しくお願いします。
73NAME IS NULL:2010/06/29(火) 20:36:02 ID:???
障害が発生したらmysqldumpが異常終了すると思うけど、
気になるなら別のサーバにリストアして件数でも数えてみたらいいんじゃないの
74NAME IS NULL:2010/07/07(水) 15:49:13 ID:o6uZh2cy
既出だとは思うのですが、ネットで調べても具体的な数値が見えてきませんでしたので質問させてください
InnoDBとMyISAMは後者の方が早いらしいですが、大体どの位スピードは違うのでしょうか?
大規模なDBなど扱ったことがないので分からないのですが、今までもDB以外の分野でこっちの方が高速と書かれていても、実際はさほど差はないということも多々ありました
体感的、具体的にはどの位早いのでしょうか?
もしそれほどパフォーマンスに差がないようならばInnoDBに一本化しようかと考えているのですが
75NAME IS NULL:2010/07/07(水) 16:07:24 ID:???
>>74
>>InnoDBとMyISAMは後者の方が早いらしいですが

使い方によるんじゃない?
76NAME IS NULL:2010/07/07(水) 16:36:48 ID:???
77NAME IS NULL:2010/07/07(水) 17:12:37 ID:???
パフォーマンスに多少の差があってもInnoDBに一本化していいと思う
78NAME IS NULL:2010/07/07(水) 18:16:43 ID:???
トランザクションがない時点でステ>MyISAM
79NAME IS NULL:2010/07/07(水) 19:13:20 ID:dGxQf47y
トランザクションがないなら
NoSQLで良いな
80NAME IS NULL:2010/07/07(水) 19:55:49 ID:???
今、MySQL5.1.19を使っていて、
これからMySQL5.1.47にバージョンアップしようとしているのですが、
MySQLを停止して、MySQLのモジュールをインストール(BSD環境なので、make→make install)して、
MySQLを起動するだけで大丈夫でしょうか?

(1) 設定ファイルを書き直す必要がありますか?
(設定項目が削除されたり追加されることがありますか)

(2) データベースのファイルの互換性がなくて既存のデータが壊れるようなことはありますか?

宜しくお願いします。
81NAME IS NULL:2010/07/07(水) 20:02:52 ID:wE54BEI5
一つのフィールドの定義に悩んでます。
当分の間であればDECIMALの5桁で大丈夫なのですが、
理論的には10桁が必要です。
件数が1000万件を超えるのですが、
5桁で定義するのと10桁で定義するので、データが違ってきますか?
定義とデータの大きさの関係が分からないので、どなたか教えて下さい。
82NAME IS NULL:2010/07/07(水) 20:32:12 ID:???
マニュアル見ればいいんじゃね? >>81

ttp://dev.mysql.com/doc/refman/4.1/ja/storage-requirements.html
これは、4.1 のものだけど。
83NAME IS NULL:2010/07/08(木) 07:05:24 ID:???
>>74に関連して。

そういえばMyISAMを利用しないようにしてもいいのでしょうか?
そもそもできないかもしれませんが、skip-myisamしてユーザテーブルとかをalter talbe engine=innodb;してもいいか、迷ってやってません。
そんなことしたらテンポラリテーブル作れないよとか、じつはシステムが利用するエンジンを変えて運用する
tipがあって、とか、おもしろいヒントがあれば教えてください。

ちなみにその目的はメモリ使用量を下げたいがため、です。
84hage:2010/07/08(木) 07:15:23 ID:???
>>80
freebsdだとportupgradeしてmysql再起動すればさくっと動きました。
5.1とのおつきあいもちょくちょくあげながらかなり長くなってきました。

5.1系列から5.5にしたら一部クエリで性能ががた落ちしたので取りやめとなりました。
エンジンが増えたり減ったり、ログのフォーマットが変わったりするとデータが壊れる(認識できない)こともあるでしょうが、
同系列なら大丈夫です。

同系列での設定ファイルはあまり書き換えなくてよいです。違う系列だと動作が違ったり、大幅に変わってたりで困ります。
たしかデフォルトのレプリケーションのリレーログへ書き込むか否かの挙動だとか、スレッドの本数の設定だとかが
違った覚えがあります。
skelファイルついてくるのでそれを見ながら書いてますが、51同士だと変更もなかったはずです。

なおオプションなどでdeprecatedされていくものはエラーログに記録されます。
流行について行けないとある日突然困るかもしれません。

なので(1)への返答はNo、(2)への返答もNoです。

ただし万全を期してフルバックアップはお忘れ無く。
85NAME IS NULL:2010/07/09(金) 02:19:37 ID:???
MySQL勉強中の、未熟者です。
本を読んでも実務に直結する内容の情報がなかったので質問させてください。

仕事(業務)で、webアプリケーション用のDBを構築しなくてはいけない状況で、
クライアントさん(お客さん)のサーバーで作業、動作確認ができないという場合、
仮に他のサーバー上でテストしておくというのはよくあることなんでしょうか。
他のサーバーでテストして作っておいたデータベースを
お客のサーバーでまったく同じように再現する?感じですか。
その場合、サーバーへのアクセスはSSHで行うというので正しいでしょうか。
レベル低い質問ですみません。
86NAME IS NULL:2010/07/09(金) 02:38:00 ID:???
仕事なら上司に聞けばいいんじゃねーの?
87NAME IS NULL:2010/07/09(金) 02:50:05 ID:???
>クライアントさん(お客さん)のサーバーで作業、動作確認ができないという場合、
>仮に他のサーバー上でテストしておくというのはよくあることなんでしょうか。
よくある、というか、普通はそうなる。
>サーバーへのアクセスはSSHで行うというので正しいでしょうか。
前段との関連が意味不明だけど、
物理的(インフラ)なテストと、論理的(アプリ、データ)なテストとでは目的が違うから、何が必要かは一口には言えん。
88NAME IS NULL:2010/07/09(金) 09:04:30 ID:???
>>83
内部データを格納するmysqlデータベースがMyISAMで作られているので
skip-myisamはできない
89名無しさん@そうだ選挙に行こう:2010/07/10(土) 08:45:56 ID:???
MySQL5.0.51aでデータベースを構築しています

kanriというtableに
ID | sale | hinichi
1 1000 2010-06-01
1 1200 2010-06-10
1 1000 2010-06-15
2 2000 2010-06-05
2 1500 2010-06-10
(実際のhinichiはtimestampを自動で更新するようにしていますが、上記の時刻は省いて書いています)

このような感じで一つのテーブルに纏めているのですが
今日のsaleが5日前と比べて同等以下というIDを抽出したいと思っています

http://gihyo.jp/dev/serial/01/sql_academy/0005?page=1
ここを参考にしながらやったのですが、どうも上手くいきません
どのようなクエリを書けばいいのでしょうか?
よろしくお願いします
90名無しさん@そうだ選挙に行こう:2010/07/10(土) 10:31:54 ID:???
試しちゃいないが、こういう感じのこと?

SELECT ktoday.ID, ktoday.sale, ktoday.hinichi
FROM kanri ktoday, kanri kbefore
WHERE
   to_days(ktoday.hinichi) = to_days(now())
 AND to_days(ktoday.hinichi) - to_days(kbefore.hinichi) = 5
 AND ktoday.sale <= kbefore.sale
91名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:03:30 ID:???
>>90
ありがとうございます
日付のとり方でODBCのエラー(VARBYTE)が出ましたが
そこだけ変えたら上手くいきそうな感じになりました
92NAME IS NULL:2010/07/12(月) 12:22:41 ID:HNUgzOdL
mysql のコマンドプロンプトで
mysql> desc table1;
とすると、経線付きの表形式で結果が表示されますが、
unixのコマンドラインで
% echo 'desc table1' | mysql -u root dbname
とすると、経線がつきません。
unixのコマンドラインで実行したときも、経線付きの表形式で結果を取得したいのですが、どうすればいいでしょうか。
なおunixのコマンドラインで実行するのは、シェルスクリプトで使いたいからです。
よろしくお願いします。
93NAME IS NULL:2010/07/12(月) 13:02:46 ID:???
>>92
mysql -u root dbname -e 'desc table1'
94NAME IS NULL:2010/07/12(月) 13:21:10 ID:???
isattyで出力を切り替えてるから
これじゃリダイレクトかパイプすると駄目だ
スマソ忘れてくれ
95NAME IS NULL:2010/07/12(月) 13:31:29 ID:???
-tオプションで良さげ
96NAME IS NULL:2010/07/12(月) 14:30:01 ID:???
>>95
-t オプションできました!ありがとう、愛してる!
97NAME IS NULL:2010/07/12(月) 17:18:54 ID:mKjPxL2y
mysqlって構造が全く同じなら1つのテーブルにまとめたほうが高速なの?
数千万件のレコードから検索する場合。

大量の小さなテーブルから1つのテーブルを選択するコストと
1つの巨大なテーブルから1レコードを選択するコスト
どっちが大きいのか?

何か判断の指針ある?
98NAME IS NULL:2010/07/12(月) 19:40:18 ID:???
インデックス張ってあるカラムで検索するんだったら、
件数大量でも大して遅くないでしょう。
下手な条件指定で遅い検索になっちゃってるなら、
件数にリニアに比例しちゃうことも。
その場合は少々件数が少ないテーブルでも遅いわな。

というわけで、んなこと考えとらんで、適切なカラム構成とインデックス、
それとSQLの最適化に頭使った方が良いよ。
99NAME IS NULL:2010/07/14(水) 22:11:34 ID:???
read/writeの割合が半々とwriteの比率が高くクラッシュしても空テーブルから再始動することが許容されるinnodb mysql においてI/Oがボトルネックで悩んでいる場合、データディレクトリをtmpfsにすることはありでしょうか?
100NAME IS NULL:2010/07/14(水) 22:17:25 ID:???
メモリにおきゃいいじゃん>テーブル
101NAME IS NULL:2010/07/15(木) 07:26:08 ID:???
クラッシュ時のデータ損失が許されるなら
innodb_flush_log_at_trx_commitを2にしてみて。
102NAME IS NULL:2010/07/16(金) 15:55:27 ID:3VCm3rNR
どこの板、スレが該当するかわからないのでスレ違いだったら申し訳ないです。
PHP+MySQL5.1でサイトを作っているのですが、
ADODBのCacheFlushが全削除かSQL文ごとにしかキャッシュを消せないので
全削除だと一時的にものすごく負荷が高まってしまうので、
テーブル更新時に該当するテーブルが関連するSQL文ごとに消そうと思っています。
ですが、ユーザーの検索ワードによってSQL文が微妙に違うので予め消すSQL文というのがわかりません。
なのでユーザーが検索するたびにSQL文を別テーブルに
create table sql_log( table_name VARCHAR(30) PRIMARY KEY, query VARCHAR(200) UNIQUE )
のように作ってそこに毎回insertしようと思ったのですが、selectにキャッシュが働いても
同じ数だけinsertしたらむしろだめじゃん・・・と思ったのですが、 なにかうまい方法ないでしょうか?

ちなみに>>97さんのような疑問を私も持ってたのですが、
高頻度にinsertする場合はindexが多いとselect時よりもむしろinsert時に問題がでると思って
大量の小さなテーブルって方を選択しました。
103NAME IS NULL:2010/07/16(金) 18:04:21 ID:???
初心者質問ですみません。

VistaにMySqlのODBCをインストールしようとしています。
mysql-connector-odbc-5.1.6-win32.msiを実行した時は特にエラーもなく終わるのですが、
ODBCアドミニストレータでDSNを追加しようとすると「ドライバのセットアッププログラムが
見つかりません」「レジストリでコンポーネントが見つかりません」というエラーになります。
(レジストリエディタにはMySQL AB\MySQL Connector/ODBC 5.1 というのはあります)

気になったのが、ODBCアドミニストレータでドライバを選択するリストで
"MySQL ODBC 5.1 Driver"の情報が名前以外表示されていないことです。

考えられる原因は何で、どうすればDSNを追加できるようになるのでしょうか?
104103:2010/07/16(金) 19:10:58 ID:???
追記です。

レジストリエディタを見たところ、ODBC\ODBCINST.INI配下にMySQL ODBC 5.1 Driver 
というのがあるのですが、オープンエラーになって内容が見れません。
この配下にdllファイルの設定ができるようなので、ここが更新されれば
上手くいくような気がするのですが…
105NAME IS NULL:2010/07/17(土) 22:22:18 ID:WEWF6qwE
フリーのMySQLを使っています
が、有料版のMySQLとの違いが知りたいと思います
具体的にどのような所がフリーと有料とで違うのでしょうか?
106NAME IS NULL:2010/07/17(土) 23:19:29 ID:???
サポート
107NAME IS NULL:2010/07/18(日) 11:44:12 ID:???
ソース共通だからダウンロードしてくれば商用版ビルドできるよ
ログイン時のメッセージが変わります
108105:2010/07/18(日) 13:24:25 ID:???
>>106
サポートだけなのですか?
確かにMySQLの本とかでも商用版とフリー版でこういう機能が違うというような一覧など見かけたことはありませんが

>>107
そうなのですか
それにログイン時のメッセージくらいなものなのですか・・・
109NAME IS NULL:2010/07/18(日) 13:32:14 ID:???
ライセンス条項読めばいいんじゃね?
110NAME IS NULL:2010/07/18(日) 16:21:53 ID:???
111NAME IS NULL:2010/07/18(日) 16:54:24 ID:???
ttp://www.softagency.co.jp/products/mysql/mysql_enterprise/

ttp://www.softagency.co.jp/products/mysql/price/

高いね・・・
Basicなんて殆ど意味が無いような気もするけど
112NAME IS NULL:2010/07/18(日) 17:45:36 ID:???
仕事でSIやってるならたいして高くないでしょ

PostgreSQLの方が高い
http://www.sraoss.co.jp/prod_serv/support/pgsql-mainte.php
113NAME IS NULL:2010/07/18(日) 19:08:03 ID:???
そうかなぁ、1台だけだとまぁって感じだけど数台ともなるとコストも馬鹿にならないし
114NAME IS NULL:2010/07/19(月) 08:50:14 ID:???
もう一人コード書きを雇おうか、ってときの選択肢なんだからこんなもんだろ。
BASICは、サポート代ってより子守代か。
115NAME IS NULL:2010/07/23(金) 08:42:20 ID:REpy7JWz
MySQLにレコードを登録更新するときにはどのようにされてますか?

いったん既存のレコードを読み込んで、
キーのチェックをして、既に存在していればUPDATE文、
存在しなければ、INSERT文を発行するといった具合にされてますか?

INSERT ... ON DUPLICATE KEY UPDATE 構文は便利なんですが、
キーが複数個ある場合はあまり使えないようなので、
みなさんがどのようにされているか気になりました。

なお、開発言語はPHPを使用しています。
116NAME IS NULL:2010/07/26(月) 06:19:32 ID:???
XAMPPをインストールしましたが
5.1.41の日本語化がわかりません
googleで検索してもやりかたがいまひとつ理解できませんでした

5.0.41はできました
my.cnfからmy.iniになってるし、どなたかわかるかたいませんか?
117NAME IS NULL:2010/07/26(月) 12:25:46 ID:???
文字列 '1:00' は 60秒、'1:00:00' は3600秒と解釈させるにはどうしたらいいでしょうか。
select time_to_sec('1:00');
とすると、3600となってしまいますが、これを 60 と解釈してくれるオプションがあればいいのですが。
118NAME IS NULL:2010/07/26(月) 17:44:38 ID:???
>>117
あまりいい方法は見つからなかった
mysql> set @t = '1:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select if(length(@t) < 6, time_to_sec(concat('0:', @t)), time_to_sec(@t)) sec;
+------+
| sec |
+------+
| 60 |
+------+
1 row in set (0.00 sec)

mysql> set @t = '1:00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select if(length(@t) < 6, time_to_sec(concat('0:', @t)), time_to_sec(@t)) sec;
+------+
| sec |
+------+
| 3600 |
+------+
1 row in set (0.01 sec)
119NAME IS NULL:2010/07/26(月) 17:50:39 ID:???
ごめん1:0:0のときにバグるね
あとはまかせた
120NAME IS NULL:2010/07/26(月) 19:38:40 ID:???
CentOSのMySQLを5.0系から5.1.49にアップデートしました。
そして、service restart mysqldとしたところ、起動せず、ログに以下の記録が残っていました。
100726 18:54:05 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
100726 18:54:50 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
100726 18:54:50 [Note] Plugin 'InnoDB' is disabled.
/usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist
100726 18:54:50 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
100726 18:54:50 [ERROR] /usr/libexec/mysqld: unknown option '--skip-bdb'
100726 18:54:50 [ERROR] Aborting
100726 18:54:50 [Note] /usr/libexec/mysqld: Shutdown complete
100726 18:54:50 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
書いてある通りに、mysql_upgradeをやってみたのですが、
mysqlcheck: Got error: 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) when trying to connect
とでて、起動しませんでした。
どうすれば起動するようになりますか?
121NAME IS NULL:2010/07/26(月) 20:42:09 ID:???
>>120
pidファイルやsocketファイルの置き場所として
・CentOS5の付属版は /var/run/mysqld
・本家は /var/lib/mysql
を使うようになっている。/etc/my.cnfを編集してどちらかに揃えよう
122NAME IS NULL:2010/07/29(木) 22:36:37 ID:ZaZ5fIWy
更新・参照ともによく使いテーブルがあり、
そのサイズが現在5GBあります。
今後も増える見込みで、10G、20Gと増えていくのですが、
このような場合、テーブルを分けた方が宜しいでしょうか?

具体的には、同じ構造のテーブルに、データのサブカテゴリー別に振り分けるようなイメージです。
DELETE、INSERTを繰り返すため、定期的な最適化が必要で、その為には一つ一つのテーブルが小さい方がメンテナンスを細かく行なうことができるので、メリットがあります。
それと、今後サイズが更に増えた場合、処理速度が落ちないか心配です。

アドバイスを頂けたら幸いです。どうぞ宜しくお願いします。
123NAME IS NULL:2010/07/29(木) 22:44:26 ID:???
履歴データとかで、もう参照しないデータなら別テーブルに分ければいいと思うが、
参照するデータを別テーブルに分けて、どうやって運用していくつもり?
メリット以上にデメリットが多いんじゃないの?
124NAME IS NULL:2010/07/29(木) 22:53:55 ID:ZaZ5fIWy
>>123

早速のアドバイスありがとうございます。

>履歴データとかで、もう参照しないデータなら別テーブルに分ければいいと思うが、
言葉足らずですみません。参照しないデータは定期的にバックアップ用のテーブルに移し替えていまして、
すぐに必要になる可能性のあるデータだけで5GBになっています。

>参照するデータを別テーブルに分けて、どうやって運用していくつもり?
今考えているのは、同じ構造で、TABLE_GATEGORY1、TABLE__GATEGORY2と分けて、
参照する際のサブキーを見て、どのテーブルを参照するか決めようかと思っています。
プログラムのSQLを生成する際に、
$sql = "SELECT * FROM TABLE_" + $category_ID;
とするようなイメージです。

>メリット以上にデメリットが多いんじゃないの?
同じ構造のテーブルがいくつもあるって、確かに美しくないのですが、
このテーブルだけ分割することが難しく、一つのテーブルが10G、20Gになると扱いにくくならないかの方を心配しています。
125NAME IS NULL:2010/07/30(金) 00:22:05 ID:2FKrzlCl
INSERT INTO *** (a,b,c) values (1,2,3)
或いは
INSERT INTO *** (a,b,c) SELECT a,b,c from ***

という方法はわかるのですが
例えばaとbは固定でcの中身が複数ある場合
INSERT INTO *** (a,b,c) values (1,2,3),(1,2,4),(1,2,5),(1,2,6),(1,2,7),(1,2,8)
ではなくて

INSERT INTO *** (a,b,c) values (1,2,select c from *** where *******)

みたいな形で複数を一度にインサートするスマートな方法はありますでしょうか
126NAME IS NULL:2010/07/30(金) 00:37:16 ID:???
つ (select 1,2,c from *** where *******)
127NAME IS NULL:2010/07/30(金) 00:50:38 ID:???
ありがとうございます!
128NAME IS NULL:2010/07/30(金) 01:02:23 ID:???
できました。スマートになりました。
あとは速度的な問題ですが、検証してみたいと思います。
129NAME IS NULL:2010/07/30(金) 02:03:10 ID:???
速度はほとんど変わりませんでした
130NAME IS NULL:2010/07/30(金) 03:39:00 ID:???
もうひとつお願いします。

SELECT a,b,c FROM table1 where EXISTS (SELECT * from table2 where a=hogehoge)

これは
テーブル table1 のカラムa と テーブル table2 のカラムhogehogeが合致するものを検索
でよかったでしょうか。
よろしくお願いします。
131NAME IS NULL:2010/07/30(金) 03:40:03 ID:???
>>122
典型的なパーティショニング機能の適用ケースだと思うけど
http://dev.mysql.com/doc/refman/5.1/ja/partitioning.html
132NAME IS NULL:2010/07/30(金) 03:40:42 ID:???
× SELECT a,b,c FROM table1 where EXISTS (SELECT * from table2 where a=hogehoge)
◯ SELECT a,b,c FROM table1 where EXISTS (SELECT * from table2 where hogehoge=a)

に訂正します。
133NAME IS NULL:2010/07/30(金) 04:09:05 ID:???
>>130
その書き方はおそらく性能が悪い。普通はこう
SELECT t1.a, t1.b, t1.c
FROM table1 t1
INNER JOIN table 2 ON t1.a = t2.hogehoge;
134NAME IS NULL:2010/07/30(金) 04:10:02 ID:???
>>132
評価式の左右がどっちとかRDBMSには関係ないよ
135NAME IS NULL:2010/07/30(金) 04:10:55 ID:???
>>133
誤記
>INNER JOIN table 2 ON t1.a = t2.hogehoge;
INNER JOIN table t2 ON t1.a = t2.hogehoge;
136NAME IS NULL:2010/07/30(金) 10:01:16 ID:???
>>134
オプティマイザに関係してくるでしょ
137NAME IS NULL:2010/07/30(金) 11:33:47 ID:???
>>136
いやー少なくとも今のバージョンは関係ないと思う

オプティマイザは最初に推移律が成立するものを
ゴリゴリ書き換えて、左右もそのときに直すはず
だけど証拠がないので時間があったらソース確認してみる
138NAME IS NULL:2010/07/30(金) 13:41:23 ID:eCwiMoLf
>>131
頂いた内容を拝見しましたが、とても便利な機能ですね。
長く使っていましたが、初耳でした。もしかしてMySQLの開発者の方でしょうか?
大変助かりました。早速来週から使ってみようと思います。

これからも、ご活躍を願っております。
139NAME IS NULL:2010/07/31(土) 21:54:54 ID:???
初歩的ですみません。
ユーザ情報のテーブルを作成し、フィールドにパスワードの項目を追加したのですが、
SHOW FIELDS FROM [テーブル名];
としたときに、パスワードの列を****のように表示させることはできるのでしょうか?
ぐぐってもMySQLの管理者パスワード関係のものばかりで、うまくヒットしないもので・・・。
140NAME IS NULL:2010/07/31(土) 22:41:22 ID:???
パスワード見たくないなら、カラムにはハッシュ化後の値を書き込むよろし。
141NAME IS NULL:2010/08/01(日) 05:55:34 ID:???
基本的にはINNER JOINって遅いんですかね?
普通に抽出したものをperlなりphpなりで仕分けしたほうが断然早かったです。
SQLの書き方が悪いのかなぁ
142NAME IS NULL:2010/08/01(日) 06:15:32 ID:???
INNER JOIN *** ON (a = b)

これだと a=b の条件にマッチしたものをjoinしますが
逆にa = bが成立した場合はjoinしないという方法はありませんでしょうか
!=だとインデックスが使われないので悩んでます
143NAME IS NULL:2010/08/01(日) 06:44:55 ID:???
いろいろ調べましたらjoinが遅いのではなくて
その後のorder byが遅いのがわかりました。
joinしたものにはインデックスが適用されてないということですね。

joinする前に予めソートしておけばと思うのですが
そのような事は可能でしょうか。
やり方を教えていただけると嬉しいです。
144NAME IS NULL:2010/08/01(日) 09:42:35 ID:???
効果はあるみたいだよ。 >>143
ttp://nippondanji.blogspot.com/2009/03/using-filesort.html

ことによっちゃあ数百倍早いんだってさ。
ttp://www.flatz.jp/archives/2199
145NAME IS NULL:2010/08/01(日) 11:24:17 ID:???
>>142-143
INNER JOIN *** ON (a != b)
これってCROSS JOINしてその大部分の結果を使うのとおなじことでしょ。
そうすると結合に関しては、インデックスは使わないというより使う意味が
ないんじゃないかな。

情報が少ないからエスパー混じるけど、ORDER BYで複数テーブルの
フィールドしているのが原因かと。
>>144読めば分かるけどテーブルを跨いでソートする場合、結合した大き
な結果セットをソートするから遅くなる。
一時テーブル(a, b)を作って、これにインデックスを張っておく。ORDER BY
はこの一時テーブルのを指定して、この一時テーブルに対して結合するように
すれば軽くなるかもしれない。
146NAME IS NULL:2010/08/01(日) 12:08:00 ID:q3fWzOwJ
ソートキーが一方のテーブルのフィールドのみからなって、そこにインデックスが
ある場合が一番速いってことだろ、>>144は。
つまりNestedLoop最強。
147143:2010/08/01(日) 13:59:47 ID:???
アドバイスありがとうございます。
しかしながらやはりjoinよりexists(select〜の方が
100倍以上早かったです。
SQLむずかすい;;(同じ結果を抽出するSQLを下に書きました)

(遅い)
SELECT a,b,c FROM t1
INNER JOIN chk ON (Yid = Wid and Mid = '$id')
where a = '1' and b = '2'
order by Time DESC



速い
SELECT a,b,c FROM t1
where
EXISTS (SELECT * from chk where chk.Mid='$id' and chk.Yid = t1.c) and
EXISTS (SELECT * from t1 where a = '1 and b = '1')
order by Time DESC
148143:2010/08/01(日) 14:06:19 ID:???
訂正します
速い
SELECT a,b,c FROM t1
where
EXISTS (SELECT * from chk where chk.Mid='$id' and chk.Yid = t1.c) and
a = '1 and b = '2'
order by Time DESC

でした。場合によっては1000倍違いました。
149NAME IS NULL:2010/08/01(日) 14:50:33 ID:???
コピペミスってるのか知らんけど
遅い方の Yid = Wid と
速い方の chk.Yid = t1.c の条件がかみ合ってないよ
150143:2010/08/01(日) 15:10:10 ID:???
手打ち間違いしてしました。
見にくいので再度張りました。何度もすみません。

(遅い)
SELECT a,b,c FROM t1
INNER JOIN chk ON (Yid = t1.c and Mid = '$id')
where a = '1' and b = '2'
order by Time DESC



速い
SELECT a,b,c FROM t1
where
EXISTS (SELECT * from chk where chk.Mid='$id' and chk.Yid = t1.c) and
where a = '1 and b = '2'
order by Time DESC
151NAME IS NULL:2010/08/01(日) 15:57:41 ID:???
下のパターンで速くなるなら、
上のクエリにSTRAIGHT_JOINつけてみて。

SELECT STRAIGHT_JOIN a,b,c FROM t1
INNER JOIN chk ON (Yid = t1.c and Mid = '$id')
where a = '1' and b = '2'
order by Time DESC

うまくいったら両方のEXPLAIN見せてほしい
152143:2010/08/01(日) 16:23:58 ID:???

1 PRIMARY rbbs ref Note,News News 18 const 3960 Using where; Using filesort
2 DEPENDENT SUBQUERY mytubu ref Mid,Yid Yid 4 community.rbbs.Wid 23 Using where
(1,362 合計, クエリの実行時間 0.1659 秒)


>>151の方法
1 SIMPLE t1 ref Wid,Note,News News 18 const 5808 Using where; Using filesort
1 SIMPLE mytubu ref Mid,Yid Yid 4 community.t1.Wid 23 Using where
(1,365 合計, クエリの実行時間 0.0629 秒)

1/3になりました!!!すごい!!!!
153143:2010/08/01(日) 16:52:44 ID:???
とおもったら、しばらく回してたら激重になっちゃいました。
もう少し本とか買って勉強したいと思います。
お付き合いありがとうございました。
154NAME IS NULL:2010/08/01(日) 21:51:07 ID:???
0.1秒を切るレベルでのチューニングなのか
そしたらちょっと難しいな

CREATE INDEX t1_test ON t1 (a, b, Time);
とやってEXPLAIN1行目のUsing filesortを消す、

さらに
CREATE INDEX mytubu_test (Yid, Mid);
とやってEXPLAIN2行目にUsing indexが付けばもうちょっと良くなるかも

あとはパラメータ側で、MyISAMならkey_buffer_size、
InnoDBならinnodb_buffer_pool_sizeを数十〜数百MBに増やす、
それからsort_buffer_sizeを1〜2Mに増やしてみるぐらいかな
155NAME IS NULL:2010/08/02(月) 11:12:07 ID:???
MySQL 5.0.91
CentOS 5.4

DBアクセスを参照のみに制限したくて、
GRANT SELECT on `test-db`.* to `db-user01`@`%` identified by 'password';
FLUSH PRIVILEGES;
とやったのですが、試したら普通にUPDATEできてしまいます。
書き込みを制限するにはどうすればいいんでしょうか?
156NAME IS NULL:2010/08/02(月) 13:38:34 ID:???
基本的な事聞いていいですか

where a=1 and b=5 and c=abc

a,b,c全てにインデックスを貼っている場合と、一つ或いは二つしか貼っていない場合だと速度は違いますか
つまりwhereで使うもの全てにインデックスを貼ったほうが性能があがるんでしょうか
157NAME IS NULL:2010/08/02(月) 13:59:13 ID:???
はい
158NAME IS NULL:2010/08/02(月) 14:25:29 ID:???
ありがとうございました。
159NAME IS NULL:2010/08/02(月) 18:11:12 ID:???
>>155
よくあるのがdb-user01以外で繋がってしまっているケース
mysql> status;
してCurrent user: を確認してみて
160NAME IS NULL:2010/08/03(火) 12:08:01 ID:???
>>159
どうもです。PHPからdb-user01で接続しているのでそれはないですね。
人に聞いたら、そもそもそういう書き込み制限はできないみたいです。
じゃあGRANT SELECTって何よ、って気もしますが…。ぐぐったらできそうなこと書いてあったんですが
実際できないものはしょうがない。
アプリ側で誤って書き込まないよう気を付けるしかないようですね。不安だ。
161NAME IS NULL:2010/08/03(火) 12:55:51 ID:???
ほんとに、updateとかの権限が無いかどうか確かめてみては?

use mysql;
select * from user where user='db-user01'\G
162NAME IS NULL:2010/08/03(火) 14:04:05 ID:???
>>161
どうもです。
いろいろ試してる間にSELECT権限も消しちゃったのか、priv関連は全部Nになってました。
それでも参照も書き込みもできます。
163NAME IS NULL:2010/08/03(火) 15:16:29 ID:???
そしたらあとはmy.cnfに
skip-grant-tables
が入っているとか?
164NAME IS NULL:2010/08/03(火) 23:30:14 ID:DnqSeYXe
MySQL Clushter(GPL版)についてお尋ねします。
web上での情報を集めていて、これから導入するか検討中です。

(1) 更新処理の際に、全てのデータノードに更新をかけるという仕組みのようですが、
それだと、1台の時と比べて著しく遅延したりすることはないでしょうか?

(2) これは、冗長性を確保するための機構で、パフォーマンスを改善させるための機構としては有効ではないのでしょうか?

私の運営しているサイトが次第に人が増えて乗り換えが必要になってきたのですが、
冗長性と同様にパフォーマンスも改善したいと思っています。
165NAME IS NULL:2010/08/03(火) 23:46:22 ID:???
導入しない方が良いと思うな。ありゃ有料サポート必須。
166NAME IS NULL:2010/08/04(水) 02:52:37 ID:urkSox1R
ありがとうございます。
もし、宜しければ理由をお聞かせ頂けると助かります。

ドキュメント不足で、エラーの解決に時間が掛かる。
構成が複雑で、独学では時間が掛かる。
有償オプションが付かないと実質的に運用に耐えられない。

などですか?
167NAME IS NULL:2010/08/04(水) 16:50:14 ID:???
それが調べられれないレベルだからだと思うが。。
168NAME IS NULL:2010/08/06(金) 06:43:05 ID:gPbyC/Ky
冗長性とパフォーマンスなんて相反するもの。
普通はトレードオフを考えるもんだ、まともなエンジニアなら。

サイトといっても、課金などのミッションクリティカルな運用してるわけではないようだから、
水平分割や垂直分割のキーワードで負荷分散の方法を調べるのが吉。
169NAME IS NULL:2010/08/06(金) 23:17:56 ID:???
このレスの少なさから判断すればいいね>MySQL Cluster
はたして将来流行るんだろうか
170NAME IS NULL:2010/08/07(土) 00:36:08 ID:???
ここ数年5.0.51を使っています
最新版にアップする価値はあるでしょうか。
サーバーはi7を使っていて
マルチコアへの改善点があるようなので興味があります。
171NAME IS NULL:2010/08/07(土) 00:43:04 ID:???
MyISAMは変わってないよ
InnoDBならやってみる価値あり
172NAME IS NULL:2010/08/07(土) 00:53:22 ID:???
ありがとうございます。
173NAME IS NULL:2010/08/07(土) 12:38:44 ID:pe8wzQKR
>>170

OSなに?
Windowsだとダメだよ
174NAME IS NULL:2010/08/07(土) 12:45:55 ID:???
>>173
ダメの理由は?
175NAME IS NULL:2010/08/07(土) 15:04:55 ID:pe8wzQKR
スレッド回りの改造はLinux前提だから。
176NAME IS NULL:2010/08/07(土) 16:46:20 ID:???
MySQLを独学しようと思ってるんだけど、
独学する上で何かいい課題ありませんか?

業務ではなく個人レベルだとどうも土台及び課題が設定しにくくて困ってます。
177NAME IS NULL:2010/08/07(土) 17:13:03 ID:???
いまさらMySQLなんてやめとけ。もうMySQLは終わってる
中の連中もOracleに取り入ろうとする連中と反発する連中とで完全に分裂状態
178NAME IS NULL:2010/08/07(土) 17:23:37 ID:???
そうなんですか。
就職に有効だと思って始めようと思っていたのですが下火だったとは。
一般的な質問はスレチになるので他に移動します。ありがとうございました。
179NAME IS NULL:2010/08/07(土) 17:25:57 ID:???
>>173,174
MySQL信者は前提書かずにいいとこだけ宣伝するからダメ
MySQLは速い!(MyISAMだとね)
MySQLはトランザクション対応 (InnoDBだけどね)
そして「MySQLは速くてトランザクション対応!」ってなプロパガンダをやる奴が多かった。
MySQLのデフォルトはMyISAMだろ、っていうと「デファクトはInnoDB」なんてさらっと書いてごまかす
薄汚い漢もいる。
もう勝負はついたから黙ってOracle無償版使っとけ。
180NAME IS NULL:2010/08/07(土) 17:34:14 ID:???
てかSQLなんて対して違いないんだからコードなんてすぐ書き換えられるじゃん

後、そこらへんのWebサーバーにはMySQLしか入ってないんだよね
181NAME IS NULL:2010/08/07(土) 20:21:56 ID:???
流行り廃りがあるからDBは2製品以上覚えといたほうがいい
Oracle+PostgreSQLとかSQL Server+MySQLとか
182NAME IS NULL:2010/08/08(日) 00:33:18 ID:???
へえoracle無償版なんてあるんだ
有償版とはだいぶ違うの?
(、、、とぐぐりもせずにしらっと質問)
183NAME IS NULL:2010/08/08(日) 12:47:53 ID:E9rt2nnT
複数あるゲームでランキングテーブルを設計しています。たとえば
CREATE TABLE ranking (
playerid int,
gameid int,
score int
)
のようなテーブルを定義してあるゲーム(1)であるスコア(123)を得たときに
それが現在何位かの順位を得るときに
SELECT COUNT(*)+1 FROM ranking WHERE gameid = 1 AND score < 123
という感じで順位を得てますがゲームやユーザ数が多くなると当然重くなります...
これを解決する方法って何かありませんかね?
184NAME IS NULL:2010/08/08(日) 13:58:52 ID:???
>>183
gameidとscoreの複合インデックスつくっておけば、
数百万件までは問題ないんじゃない?
どうせ下位のほうは消しちゃえばいいわけだし。
185NAME IS NULL:2010/08/08(日) 15:11:19 ID:???
>>184
なるほど、ありがとうございます。
その方法で評価してみます。
186NAME IS NULL:2010/08/09(月) 00:22:24 ID:???
>>183
リアルタイム・ランキングを考える | GREE Engineers' Blog
http://labs.gree.jp/blog/2010/07/456/
187NAME IS NULL:2010/08/09(月) 02:35:59 ID:???
>>184,185
検索条件が不等号だからrange検索になってインデックスの効果がでない。ほとんどの場合フルテーブルスキャンになる。
186の指摘通り、集計用のテーブルを別に準備してcount(*)で舐めるテーブルの範囲を極力小さくするように設計しなおしたほうがよい。

ちょっと前までKVSやNoSQLが喧騒されて、key=uid+gameid, value=scoreで分散キャッシュすればスケーラビリティ確保!!RDBは過去の遺物!
みたいな感じだったけど、NoSQLつうかKVSってこういったリアルタイムの集計がまったくダメなんだよな。
188NAME IS NULL:2010/08/09(月) 02:56:18 ID:???
修正
>検索条件が不等号だからrange検索になってインデックスの効果がでない。ほとんどの場合フルテーブルスキャンになる。

「ほとんどの場合フルテーブルスキャンになる。」は嘘。
「結果的にテーブルのほとんどをスキャンすることになる」
要するにインデックスで絞りこめないってこと。ランキング1位ならいいけど、下位ほどスキャンするカラムが多くなる。

189NAME IS NULL:2010/08/09(月) 06:56:00 ID:???
スコアも含めたインデックス作るって、
もしや誰かが自己記録更新する度に、インデックスの再編成が起きる?
190NAME IS NULL:2010/08/09(月) 08:57:33 ID:???
全体の再編成は起きない
断片化とツリーの深さ調整はかなり起きる
191NAME IS NULL:2010/08/09(月) 11:55:37 ID:???
>>186
Greeの記事大変参考になりました。
精度を犠牲にして定期的に区切りの順位の得点を集計したりと考えてみましたが
もう少し色々考えられそうですね。
192NAME IS NULL:2010/08/09(月) 12:08:40 ID:???
ニコニコ動画の毎時集計
ブラウザ三国志の1日2回集計
ぐらいでもいいんじゃないかとは思うけどね
193NAME IS NULL:2010/08/09(月) 12:27:36 ID:???
>>192
単純なランキング閲覧ならそれでokですが
ゲーム終了後にスコアに対して今のオンライン
ランキングを提示したいので...
194NAME IS NULL:2010/08/10(火) 15:51:07 ID:???
別PC(Windows)上のMySQLに、ODBC接続しようとしていますが、接続できません。

Serve:MySQLが動作しているPC名 OR IPアドレス(どちらもNG)  Prot:3306(デフォルト)
User:root
Password:rootのパスワード
を指定して「Test」ボタンをクリック

Connection Failed:[HY000][MySQL][ODBC 5.1 Driver] Access denied for user 'root'@'MYPCNAME' (using password: YES)


というエラーになります。ユーザー名:rootでパスワードも正しいものを設定しているのですが、
'root'@'MYPCNAME' この部分が気になります。 'root'のみで接続してほしいのですが。

ちなみにODBC Driverは3.51を使っても同様です。
MySQLが動いているPC上で、Server:localhost 他上記と同じに対してはODBC接続できます。
195NAME IS NULL:2010/08/10(火) 15:53:23 ID:pVnLtg0K
ageます
196NAME IS NULL:2010/08/10(火) 17:34:14 ID:???
ちゃんとgrantせんと
197NAME IS NULL:2010/08/10(火) 18:03:32 ID:???
>>196

リモート接続の許可はしてますが、他にも何か必要でしょうか。
198NAME IS NULL:2010/08/10(火) 18:33:23 ID:???
まぁ落ち着いてここを見るんだ
http://dev.mysql.com/doc/refman/4.1/ja/grant.html
199NAME IS NULL:2010/08/10(火) 21:18:22 ID:???
非常に初歩的なミスについてなのですが、ご存知の方がいれば教えていただけませんか?

Windows版 Xampp1.7.3をインストールしたのですが、
ブラウザーからphpmyadminの画面に移りMySqlのrootのパスワードを設定しようとして
誤ってrootそのものを削除してしまいました。

復旧の仕方が良く分からないので、Xampp自体再インストールしてしまおうと
アンインストール > 再インストールを行ったのですが、
rootを削除してしまった状態から元に戻すことが出来ません。

Xampp自体のフォルダーがなくなっている事、念のためリジストリ上のXamppに該当する
記述も全て削除したのですが、やはり同じです。
他に何か関連ファイルが残っているからだとは思うのですが、それを見つけることが出来ません。

Xamppを完全に新規インストールするためにはどうすればいいのでしょうか?


200NAME IS NULL:2010/08/10(火) 22:03:29 ID:???
すみません、自己解決しました。
原因は分かりませんが、何度か繰り返しているうちに上手くいきました…。
201NAME IS NULL:2010/08/10(火) 22:16:19 ID:???
こういう人こそ仮想化してスナップショット機能を活用するべき
202NAME IS NULL:2010/08/11(水) 11:32:11 ID:???
>>198

すいません。落ち着いてそこを見て

grant all on *.* to root@'%' identified by 'hogegege';

としたらうまく行きました
203NAME IS NULL:2010/08/11(水) 15:21:42 ID:???
204NAME IS NULL:2010/08/11(水) 15:23:55 ID:???
質問があります。
ぜひアドバイスをお願いします。

point テーブル
+-------+------------+
| point | expire |
+-------+------------+
| 10000 | 2010-08-10 |
+-------+------------+
| 10000 | 2010-08-11 |
+-------+------------+
| 10000 | 2010-08-12 |
+-------+------------+

point テーブルには、
ユーザの所持ポイント数 point (unsigned) と、
そのポイントの有効期限 expire が格納されています。

「有効期限が近いものから合計○ポイントマイナスする」
というような命令を単一のクエリで実現することは可能でしょうか?

たとえば、
「上記テーブルから合計15000マイナスする」とすると
以下の状態になってほしいわけです。

point テーブル
+-------+------------+
| point | expire |
+-------+------------+
| 0 | 2010-08-10 |
+-------+------------+
| 5000 | 2010-08-11 |
+-------+------------+
| 10000 | 2010-08-12 |
+-------+------------+


お詳しい方、どうぞよろしくお願いします。
205NAME IS NULL:2010/08/12(木) 02:05:51 ID:???
>>204
そういう用件のためのプロシージャ
206NAME IS NULL:2010/08/12(木) 08:06:51 ID:???
プロシージャしかない気がする
207NAME IS NULL:2010/08/12(木) 09:29:22 ID:???
208NAME IS NULL:2010/08/12(木) 09:32:52 ID:???
>>205,206
教えていただきありがとうございます!

調べたのですがいまいち確証が得られていないことがあるのですが、
プロシージャ内の処理はトランザクションのような保証はないのでしょうか。

もしないとすれば、おとなしくInnoDBにして
アプリケーション側でルーチンを組むのがよいのでしょうか。
209NAME IS NULL:2010/08/12(木) 09:58:19 ID:???
InnoDBにしてストアドプロシージャを使えばいいと思うけど。

複数レコードをアトミックに更新しないといけないから、
MyISAMの場合はプロシージャだろうがアプリで手組みだろうが
最初にLOCK TABLESしないとだめだね。
210NAME IS NULL:2010/08/12(木) 10:03:07 ID:???
>>208
> プロシージャ内の処理はトランザクションのような保証はないのでしょうか。
ストレージエンジン次第。プロシージャかどうかは関係ない。
211NAME IS NULL:2010/08/12(木) 14:57:54 ID:???
>>209,210
教えていただきありがとうございます!

お恥ずかしながらプロシージャを知らなかったので
勉強しはじめました。

単純な構文から試しに作っていこうとしているのですが、
思い通りの結果を返してくれません。

よろしければ、構文の書き方について勘違いしているところなどありましたら、
ご指摘いただけないでしょうか。

-------------------
CREATE PROCEDURE `pts_minus`(OUT out_return INT UNSIGNED)
BEGIN
-- 宣言部
DECLARE v_pts INT UNSIGNED;

-- 適当にひとつ取得
SELECT p.point INTO v_pts FROM point_table p LIMIT 1;

-- 取得した値が0より大きいかどうかで返す値を変える
IF v_pts > 0 THEN
SELECT 20 INTO out_return;
ELSE
SELECT 10 INTO out_return;
END IF;

END
---------------

---------------
CALL pts_minus(@out_return);
SELECT @out_return; -- ここで10か20の値が入っていてほしいのになにも入っていない
---------------
212NAME IS NULL:2010/08/12(木) 15:21:34 ID:???
ふつーに動いたよ。コピペして、プロシージャ、point_table 作って、insert。
SELECT 20 INTO out_return;
の代わりに
SELECT 20; でもおk
213NAME IS NULL:2010/08/12(木) 20:16:47 ID:???
>>212
ありがとうございます!

取得部分で構文を間違えていたようで、
その部分を修正したら期待通りの値が取得できました。

単純に SELECT ○; でもいいのですね。
勉強になりました!
こうなるとOUT out_return INT UNSIGNEDの
存在意義がいまいちわかりません…。
214NAME IS NULL:2010/08/12(木) 20:20:08 ID:???
と思ったら、SELECT ○; にすると
OUT out_return INT UNSIGNEDは普通にいらなくなるのですね。
失礼しましたー。
215NAME IS NULL:2010/08/12(木) 22:09:06 ID:???
プロシージャについて、もう一点教えていただけないでしょうか。

一連の処理内でテーブルから値を取得するときは

DECLARE v_pts INT UNSIGNED;
SELECT p.point INTO v_pts FROM point_table p LIMIT 1;

このようにすると理解していますが、
取得したい型がENUMやSETの場合はどのようにすればよいのでしょうか。

DECLARE v_pts SET;
DECLARE v_pts VARCHAR(50);

としても取得することはできませんでした。
216NAME IS NULL:2010/08/13(金) 02:20:35 ID:???
今MySQLの勉強をしています。
で思ったのですが、どうしてINSERT文とUPDATE文では、これほどまで書式が違うんでしょう?
正直INSERT文の書式に統一して、複数のレコードを一気に更新できるようにしてほしいと思います。
217NAME IS NULL:2010/08/13(金) 04:29:41 ID:???
>>215
enumやsetの性格を考えたら、わかるじゃまいか。

>>216
update hoge (c1,c2) values (1,2) where cd = 1; つーことすか?
あんまり変わらないような?w 
だいたい複数レコードを一気に更新は、現在でも
218215:2010/08/13(金) 10:21:03 ID:???
>>217
ありがとございました。
勘違いでして、普通にVARCHARに入れることができました。

また、カーソルなのですが、ドキュメントとを読むと「読み取り専用」とありますが、
宣言後に内容を書き換えたり、
もしくは変数名とCURSORという型だけ宣言しておいて、
中のSELECT文はあとから代入する、というようなことはできないのでしょうか?
219NAME IS NULL:2010/08/13(金) 17:00:43 ID:???
SELECT (SELECT 10) AS ten, ten + 20;

このようにサブクエリで得た値を使い回したいのですがうまくいきません。
何かこれを実現する方法ってあるのでしょうか?
220216:2010/08/13(金) 20:25:56 ID:???
>>217
そういうことです。
phpでSQL構文を発行する場合、「insert」と「update」のどちらを加えるかを切り替えるだけで済む気がします。

質問なのですが、上記の点は「replace」を使えば解決しそうな気もしますが、ID(主キー)がauto_incrementの場合、
IDを書かずに「replace」したら「insert」扱い、IDを書けば「update」扱いにできますか?

また存在しないIDを指定して「replace」するとauto_incrementの挙動はどうなりますか?
221NAME IS NULL:2010/08/14(土) 00:29:40 ID:???
>>219
select a.c1, a.c1+10 from (select 10 c1) a
サブクエリで得た値を使い回し、という要件を満たしてはいると思う

>>218>>220の疑問は、やってみれば分かるものだから、がんばってください。
222NAME IS NULL:2010/08/16(月) 23:42:35 ID:sU4nqUXU
GoogleMapと連携するために、緯度経度を登録するテーブルを作成しております。

id int 11
lat double
lng double

id lat lng
1 35.0156574611019 134.048652648926'
2 35.066112 134.104572

select * from latlng where lat = 35.0156574611019
では何もヒットしませんが、
select * from latlng where lat = 35.066112
だと、ID2がヒットします。

小数点以下の桁数が関係あったりするのでしょうか?
223NAME IS NULL:2010/08/17(火) 02:48:02 ID:???
手元のMySQL 5.1.49では再現しない。
MySQLのバージョンはいくつ?

mysql> create table d (id int primary key, data double);
Query OK, 0 rows affected (0.09 sec)

mysql> insert into d values (1, 35.066112);
Query OK, 1 row affected (0.02 sec)

mysql> insert into d values (2, 35.0156574611019);
Query OK, 1 row affected (0.01 sec)

mysql> select * from d;
+----+------------------+
| id | data |
+----+------------------+
| 1 | 35.066112 |
| 2 | 35.0156574611019 |
+----+------------------+
2 rows in set (0.00 sec)

mysql> select * from d where data = 35.066112;
+----+-----------+
| id | data |
+----+-----------+
| 1 | 35.066112 |
+----+-----------+
1 row in set (0.00 sec)

mysql> select * from d where data = 35.0156574611019;
+----+------------------+
| id | data |
+----+------------------+
| 2 | 35.0156574611019 |
+----+------------------+
1 row in set (0.01 sec)
224NAME IS NULL:2010/08/17(火) 02:53:08 ID:???
それはそれとして、
MySQLに限らずfloat、double値の比較を==でやっちゃだめ

http://dev.mysql.com/doc/refman/5.1/ja/problems-with-float.html
http://d.hatena.ne.jp/tociyuki/20090620/1245503707
225222:2010/08/17(火) 09:06:47 ID:5udZb+sk
>>223
バージョンは5.0.77です。
が、CPUなどによって結果変わってくるのですね…

>>224
doubleの比較をしてはいけないというのは知りませんでした。
GoogleMapで取得した緯度経度は小数点以下の桁数が多いですが、正直こんなに細かい場所まではいらないので、小数点以下の桁数を少なくし、誤差も含めて検索するように変更してみます。

select * from latlng where lat BETWEEN 35.0156574611019 - 0.000001 and 35.0156574611019 + 0.000001

想定する動作になったのですが、こんな処理で合っていますか?
226NAME IS NULL:2010/08/17(火) 10:25:34 ID:???
その数値を使って計算をしないんならdecimalでいいんじゃないか
227NAME IS NULL:2010/08/17(火) 10:42:56 ID:???
つか、例えば小数点以下3桁までしか要らなかったら、1000倍して整数にすれば楽だろ。
228222:2010/08/17(火) 13:00:25 ID:74Z9QDfh
貴重なアドバイス、ありがとうございます。

>>226
計算はしないです。
単純に登録してある緯度経度をGoogleMapに表示するのに使うだけです。
小数=float or doubleという概念しかありませんでした。
decimalも試してみます。

>>227
整数にしてしまうというのも盲点でした。
intの上限があるので、実際にどの桁数まで保存するか決め手から考えて見ます。
229NAME IS NULL:2010/08/20(金) 23:10:03 ID:T6613nBq
show processlist;は実行中のスレッドを表示しますが、
これをLinuxのTOPコマンドのように、リアルに更新する
ように見れる方法はありますか?
230NAME IS NULL:2010/08/21(土) 02:22:05 ID:???
mytopでぐぐってみたらいいよ
231NAME IS NULL:2010/08/23(月) 19:15:02 ID:???

user_table
--------------------------------
id | name | dated
--------------------------------
1 | hoge | 2010-08-21
--------------------------------
2 | hoge | 2010-08-23
--------------------------------
2 | hoge | 2010-08-22
....

thread_table
--------------------------------
id |uid |thread| text | dated
--------------------------------
1 | 1 | 1 | aaa.. | 2010-08-21
--------------------------------
2 | 2 | 1 | ccc.. | 2010-08-23
--------------------------------
2 | 1 | 2 | aaa.. | 2010-08-22
....


select
`b`.`id`,`thread`,`name`,`text`,`b``dated`
from
`user_table` `a`,`thread_table` `b`
where
`a`.`id`=`b`.`uid`
order by `dated` desc limit 5;

thread_tableのthreadの値がユニークで一番更新日が新しいもの順(order by `thread_table`.dated desc)に取り出したいのですがどうすればいいでしょうか?
distinctやgroup by `thread`を追加しても期待した値が取れませんでした。
232NAME IS NULL:2010/08/23(月) 20:04:45 ID:???
thread_table をあらかじめソートしたものを
from user_table a, (select * from thread_table order by dated desc ) b

結合。group byすればよい。
group by thread;
233NAME IS NULL:2010/08/23(月) 20:11:52 ID:???
>>232
できました!
まだgroup byの挙動が分かっていないので勉強したいと思います。
ありがとうございました。
234NAME IS NULL:2010/08/24(火) 15:13:46 ID:???
質問です。

いろんなテーブルを結合したSQLで、
その一部にだけFOR UPDATEをかけることってできませんよね?
そういう場合はクエリを分けるしかないんでしょうか。

単純な例として、
ユーザー情報と、それに関連するマスタデータを取りたくて、
ユーザ情報はロックしたいけどマスタデータはロックしたくないとき、

1.ユーザー情報だけをSELECT FOR UPDATE
2.ユーザー情報とマスタデータを結合してSELECT(ロックしない)

とするのが普通?
235NAME IS NULL:2010/08/24(火) 18:44:58 ID:???
トランザクションの使用について質問があります。

これまで、

SELECT文を実行する場合には、
トランザクションを入れていなかったのですがこの方針は正しいですか?

DELETE / INSERT / UPDATE の場合には入れてます。

236NAME IS NULL:2010/08/25(水) 00:45:23 ID:???
>>235
SELECTだけでも複数発行する場合に
途中に他の更新が入り込んで整合性がおかしくなるとかあるじゃん。
237NAME IS NULL:2010/08/25(水) 01:18:24 ID:???
>>236
・・・頻繁に更新・削除のあるシステムの場合には確かにそうですね。
今後はおとなしく入れます。。。
238NAME IS NULL:2010/08/25(水) 01:23:25 ID:???
いや、それを言うと全トランザクションをSERIALIZABLEにしないといけない
よその更新をどこまで見せるかはあくまで要件次第
239NAME IS NULL:2010/08/25(水) 01:53:03 ID:???
>>238
画面自体は

SELECT される頻度が、それ以外よりも大きいのですが
トランザクションを入れると入れない場合と比較して
やはりパフォーマンスは落ちますよね?
240NAME IS NULL:2010/08/25(水) 05:03:54 ID:???
測ってみないと分からん
241NAME IS NULL:2010/08/26(木) 17:49:17 ID:???
1レコードのサイズについてお聞きしたいのですが
レコードのサイズによってSQLのスピードが変わってきたりするのでしょうか?

テキストを保存しようとしているカラムがあるのですが、
varchar(255)とlongtextで迷っています

longtextにすればサイズの問題はないのですが、スピードや負荷に影響があるのかどうかが知りたいです

ご教授よろしくお願いします
242NAME IS NULL:2010/08/26(木) 18:07:12 ID:???
そのデータの中身に対して検索掛ける必要がまったくない(ただの保管庫として使う)なら、longtextでいいんじゃない?
243NAME IS NULL:2010/08/27(金) 04:16:12 ID:???
>>242
ありがとうございます
検索はかけないのでlongtextでいきます
244NAME IS NULL:2010/08/27(金) 23:19:01 ID:JjKQ6DGm
"select * from a ORDER BY id desc LIMIT 20, 40";
$table_id=mysql_query($sql, $conn);
$entry=MySql_Num_Rows($table_id);

これで$entryが20にならないのはどうしてでしょう?
ちなみにデータ件数は53件でこの$entryは32になります
245NAME IS NULL:2010/08/28(土) 00:52:43 ID:???
http://dev.mysql.com/doc/refman/4.1/ja/select.html
>LIMIT 節を使用すると、SELECT ステートメントで返されるレコード数を制限することができる。LIMIT は 1 つまたは 2 つの数値引数を取る。
中略
>引数が 2 つの場合、最初の引数は戻り値として返す最初のレコードまでのオフセットを表し、2 つ目の引数は戻り値として返す最大レコード数を表す。


最高で40個まで獲ってこいって言ってんだから、32でも不思議は無いわな。
246NAME IS NULL:2010/08/30(月) 18:58:50 ID:???
PHPからMYSQLを使っているのですが、データが無い時(null)に何故か、
スラッシュが表示されます。
これはこういうものなんでしょうか?
247代行:2010/09/03(金) 00:09:13 ID:t3hAyKGJ
mysql 5.1.46 winXP
show varibles;で示される内容をテキストファイルに落とす方法を教えてください
248NAME IS NULL:2010/09/03(金) 08:28:29 ID:???
-e で >
249247(代行依頼経由):2010/09/03(金) 17:30:46 ID:MQIrgEEP
>>248
有難うございます

mysql -u**** -p -e "show variables" > "c:/variable.txt"

で出来ました
250NAME IS NULL:2010/09/03(金) 22:02:29 ID:???
初心者ですみません。
2万件毎に区切られたCSVファイルを10万件分登録するとして、データの追加はどのようにすれば良いのでしょうか?
サーバーの仕様なのか、INSERTできる件数の上限があるみたいで相当な時間が掛かってしまいそうなので…。
251NAME IS NULL:2010/09/03(金) 22:15:11 ID:???
ツールを作っておくんだ。
○○行ずつ、insert文で突っ込み、待ち○○秒。
1ファイルが終わったら次。
その間、股間でも弄っているがよい。
252NAME IS NULL:2010/09/03(金) 23:01:44 ID:???
>>250
オートコミットじゃ駄目なん?
253250:2010/09/03(金) 23:15:02 ID:???
>>251
バッチとかで大丈夫でしょうか…股間はやめときます。

>>252
オートコミットで検索してみましたが、良くわかりませんでした。
初心者はINSERTでちまちまやります。

どうもでした。
254NAME IS NULL:2010/09/03(金) 23:36:25 ID:???
とりあえずマルチプルINSERT。
255NAME IS NULL:2010/09/03(金) 23:49:58 ID:???
>>250
LOAD DATA INFILEじゃ駄目なん?
256NAME IS NULL:2010/09/03(金) 23:56:08 ID:???
>>250
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
257NAME IS NULL:2010/09/04(土) 00:05:11 ID:???
通信バッファサイズというのがあってだな。
で、あの質問になったんだろ。
258NAME IS NULL:2010/09/04(土) 00:42:58 ID:???
259NAME IS NULL:2010/09/04(土) 02:39:48 ID:???
うん
260NAME IS NULL:2010/09/04(土) 13:37:01 ID:???
INDEXって付けると本当に速くなるの?
そこまで、大きいDBを扱ったことが無いからわからない
261NAME IS NULL:2010/09/04(土) 20:35:04 ID:???
大差無い
262NAME IS NULL:2010/09/04(土) 20:49:40 ID:???
レコードn件に対してO(n)かかる処理が
O(log n)で済むから速くなるよ
263260:2010/09/04(土) 21:03:00 ID:???
>>261-262
thx
264NAME IS NULL:2010/09/06(月) 12:09:59 ID:???
今まで使いやすさからSQLiteを使ってたんですがMySQLにチェンジしようと思います
そこで質問なのですが、SQLiteに慣れてばMySQLに慣れるのも早いのでしょうか?
それとSQLiteで作成したデータベースを移行したりできるのでしょうか?
265NAME IS NULL:2010/09/06(月) 12:18:36 ID:???

ーーーーここまでよんだーーーー
266NAME IS NULL:2010/09/06(月) 13:23:17 ID:???
>>264
その程度の判断ができないなら、今のままのほうが良いよ。
267NAME IS NULL:2010/09/06(月) 13:59:12 ID:???
そんなに冷たくするなよ。
>>264様は、調べに調べたんだよ。
googleで「sqlite mysql 移行」で最初に出てくるページももちろん見たさ。
けど、create redmineで躓いてしまったんだよ。。。
調べないでいきなり質問するわけがない。
268NAME IS NULL:2010/09/06(月) 15:57:31 ID:???
レプリケーションで下のような構成にしようと思ったんですがスレーブ→スレーブって無理ですか?

マスター

スレーブ1(スレーブ2のマスター)

スレーブ2
269NAME IS NULL:2010/09/06(月) 16:58:42 ID:???
>>267も情弱でワロタw
270NAME IS NULL:2010/09/06(月) 17:09:26 ID:???
>>268
多段スレーブできるよ
log_slave_updates でぐぐれ
271NAME IS NULL:2010/09/06(月) 17:33:52 ID:???
その場合、
[mysqld]
log_slave_updates
read_only
という指定でいいんでしょうか?
272268:2010/09/06(月) 17:46:02 ID:???
>>270
ありがとうございます

>>271さんは私ではないので>>271は未解決かと思います。
273NAME IS NULL:2010/09/06(月) 17:51:16 ID:???
>>272
あ、お気づかいありがとうございます。
274NAME IS NULL:2010/09/07(火) 16:03:13 ID:C1jYjJT2
上司が一生懸命
select * from example where s_id = 1 limit 0, 1
というSQLを書いているのですが、limitが有り無しでは何か変わってくるのでしょうか?

s_idは主キーです。

結果的にはlimitつけなくてもいいと思うのですが…パフォーマンスが変わってきます?
275NAME IS NULL:2010/09/07(火) 16:14:43 ID:???
s_idが主キーなら結果セット、性能いずれも
limitつけてもつけなくても変わらない
276NAME IS NULL:2010/09/07(火) 16:15:21 ID:???
>>274
アホが「s_id = 1」だけ変更するからそれの保険とか、
PKだと知らなくても1レコードしか返らないのを明示できるとか。

DB側もテーブル定義まで知らない立場でもなんらかの最適化がかけられなくもない。
実際の実装はしらんけどね。
277NAME IS NULL:2010/09/07(火) 16:16:03 ID:???
なんかの不具合へのアドホックな対策みたいで気持ち悪いわ
278274:2010/09/07(火) 16:33:39 ID:C1jYjJT2
>>275
性能も変わらないのですね、ありがとうございます。

>>276
>PKだと知らなくても1レコードしか返らないのを明示できるとか。
これくらいしか思いつかないですよね。
ですが、phpで接続しており、先頭の1レコードしか処理してないんですよ。
仮に主キーじゃなく、複数レコードが返ってきても先頭しか処理されない…

>>277
このような記述が多くみられるので、違和感を感じていて質問したのですが、ますます違和感を感じるようになってしまいました。
279NAME IS NULL:2010/09/07(火) 19:50:12 ID:???
>>269
俺からしたら>>266>>267も情弱だけどな
280NAME IS NULL:2010/09/07(火) 20:41:55 ID:???
create redmine;
281NAME IS NULL:2010/09/08(水) 02:15:45 ID:???
MySQLの情報の探し方って、意外と難しいよね。
やっと見つけても、ブログ書いてる人の文才が無くてまとまっていなかったり・・。
282NAME IS NULL:2010/09/08(水) 10:56:58 ID:???
公式嫁よ
283NAME IS NULL:2010/09/08(水) 11:52:12 ID:???
公式の訳最悪
英語読んでもやっぱりわかりにくい
284NAME IS NULL:2010/09/08(水) 13:11:03 ID:???
公式マニュアルはオンラインヘルプという
抜粋版で少し訳の品質のよいバージョンがあるよ
http://dev.mysql.com/doc/refman/5.1-olh/ja/index.html
285NAME IS NULL:2010/09/08(水) 15:47:09 ID:???
MySQLエキスパートの方に質問
ユーザーIDを単なる連番にすると推測されてしまうので
md5した値にしたんだけど、32文字の文字列を事実上キーとして使うと
速度低下しますかね?
もちろんちょっとぐらいで済めば全然良いんだけど
ていうか自分で計測しろってか、すみません
286NAME IS NULL:2010/09/08(水) 16:09:48 ID:???
>>285
推測されてまずいことあるの?
md5したってバレる人にはバレる

どういうサービスかにもよるのでそこんとこ分からないとなんともいえないけどね
287NAME IS NULL:2010/09/08(水) 16:25:07 ID:???
>>286
推測されてまずいことは多分あります
そのままmd5するわけではないのでまずばれないと思います

ひとまず速度だけが心配
あまり遅くなるようならCRC32とかに変えるかも
288NAME IS NULL:2010/09/08(水) 16:45:17 ID:???
めちゃくちゃ速度低下するとしたら、どうするの?
289NAME IS NULL:2010/09/08(水) 16:48:14 ID:???
・連番をMD5したものがユーザID
・ユーザIDは連番だけどMySQLに格納する際にMD5する
どっちなのかが分からない
290NAME IS NULL:2010/09/08(水) 17:15:10 ID:???
>>288
>>287

>>289
どっちかと言えば前者
番号を使いたくないので、md5で置き換える感じ
291286:2010/09/08(水) 17:23:16 ID:???
>>287
いろいろ知識不足で突っ込みどころ満載だけど聞かれたところだけ答える
それくらいじゃ全然問題ないからどんどんやればいいよ
292NAME IS NULL:2010/09/08(水) 17:27:35 ID:???
そうするとMD5の計算はユーザ登録のときしか使わないわけだから、
主キーが4バイトから32バイトになることによる比較処理の負荷増と、
データ量が増えてメモリに乗らなくなるタイミングが早まるところが懸念点か。

それくらいなら気にしなくてもいいと思った。
MySQLのSQL構文解析処理の方が何十倍も重いと思う
293NAME IS NULL:2010/09/08(水) 17:54:08 ID:???
オートインクリメント番号を暗号化する意味が分からない
そんなもん知られただけでまずいシステムって…

負荷とか気にする以前の問題だな
294NAME IS NULL:2010/09/08(水) 18:05:36 ID:???
たとえばmixiだとshow_profile.plに適当なID渡すとプロフ見れちゃうだろ?
そういうことをできなくしたいんだよ
簡単に言うと
295NAME IS NULL:2010/09/08(水) 18:11:03 ID:???
それはPK以外の部分でやるべき話だろう
296NAME IS NULL:2010/09/08(水) 21:04:59 ID:???
そうだな。
システム内部で扱う会員IDはユニークな連番
会員自身が認識する俺IDはメアドでも何でも
なんてのは珍しくもないだろうな。
297NAME IS NULL:2010/09/09(木) 16:15:08 ID:???
俺初心者なんだけど>>294みたいなことをできなくしたい場合
IDを暗号化するのが簡単だと思うんだが
ならそれをキーとして使えば、連番なんていらないんじゃないの?
298NAME IS NULL:2010/09/09(木) 16:39:43 ID:???
>>297
>>294みたいなことができちゃうのはプログラムの問題でしょ?
それにmixiみたいにオープンなサイトなら見られてもいいから見せているわけで。
何が問題なの?
連番がかっこ悪いとか(32文字の暗号もダサいぜ…)宗教上の理由なら別だけど。

それでも暗号化・復号化できる自作のプログラム組んで表示の時だけ暗号化したほうが絶対いい。

mysqlにはオートインクリメントとという便利な機能がある。
それをわざわざ暗号化してDBにいれるなんてどうかしてるゼ!
そもそもどんなサービスなのかすら情報がないのに応えられないわ
299NAME IS NULL:2010/09/09(木) 17:07:47 ID:???
隠したい、っていう答えで納得してやれよw
何だかわからないが隠したいIDは、PK以外でやるべきだ。
で結論が出てるし。
300NAME IS NULL:2010/09/09(木) 17:11:13 ID:???
単に宗教なのかな
Mysqlのオートインクリメントという便利な機能を使わないなんてどうかしてる!
自作のプログラム作ってエンコード&デコードするべきだ!
ってのと
面倒くさいからキーを暗号化すりゃいんじゃね?無駄なコードは書かない主義
ってのと。
まあどっちでも好きにすればいんじゃね
301NAME IS NULL:2010/09/09(木) 18:16:10 ID:???
>>299
>>291ですでに答えてるように、質問の回答だけならすでにしてる

>>300
逆にどうやって現在の連番を取得するの?
連番の計算→それを暗号化
こっちのほうが無駄なコードな気がするけど

md5の負荷を気にするような、かなり大規模なシステムなら設計段階でしっかりやるべき
パスワードをmd5なら分かるけど、連番をmd5なんて主義とか以前の問題だと思うけどな
302NAME IS NULL:2010/09/09(木) 18:38:57 ID:???
インストの段階で困ってるんだけど、どなたか相談に…。
サーバを一から環境設定していくのは初めての人間です。
Cent OSで、Tritonn(Senna) x MySQL x php を使いたい。

http://doruby.kbmj.com/fuj_on_rails/20100107/tritonn_

を参考にして
MySQL-server-5.0.87までのインストールは完了。
コンソール上でのmysql、senna動作確認は問題なし。

で、phpをyumでインストしていったのだけれど、
yum install php-mysql で失敗する。
エラーメッセージ:mysql conflicts with MySQL-server など

どうやら MySQL-server-5.0.87 と php のバージョンが合っていないみたいで、どうすれば MySQL-server-5.0.87 と競合のない php-mysql がインストールできるでしょうか。
303NAME IS NULL:2010/09/09(木) 19:24:54 ID:???
>>301
質問と関係なくコーディングに行き詰まったので出てきました、元の質問した者です。
レスくれた人たちありがとう。

作ってるのはぶっちゃけmixiアプリのゲームのようなものだと思ってください。
idの連番はこちらが作るのではなく、mixiのユーザーIDです。
それを引数に使ってDBアクセスだと、気を付けないと適当にID入れてごにょごにょ…
とかできると想定外のアクセスをされる可能性があるので
ユーザーIDを暗号化したものを引数にすればよくね?
ユーザーIDはユニークだから暗号化してもほぼ確実にユニーク→じゃあキーにすればよくね?
と思った次第です。
とりあえず速度に影響はなさそうなので、今回はこれで行く予定です。
もちろんこれ以外でのセキュリティ対策もしっかりやる予定。
304NAME IS NULL:2010/09/09(木) 20:21:51 ID:???
>>303
「も」?
305NAME IS NULL:2010/09/09(木) 20:39:30 ID:???
>>302
PHPを自前でビルド
いやまじで
306NAME IS NULL:2010/09/09(木) 20:42:28 ID:???
AUTO_INCREMENTのIDとは別にユーザーID用Columnを用意すれば
解決できるよね?
307302:2010/09/09(木) 22:48:20 ID:???
>>305
なるほど、yumは楽だけど、あんまり更新されてないし、
融通が利かないのですよね。

とりあえずMySQL-server-5.0.87と合うPHPのバージョンを探してみます。
それからビルドしてmake installかな。
ありがとう。
308NAME IS NULL:2010/09/09(木) 23:12:55 ID:???
>>306
うん、ってかどう考えても普通はそうすると思うんだがなぁ
309NAME IS NULL:2010/09/10(金) 20:33:20 ID:???
select distinct a from table1 where b=c
select distinct a from table1 where b=d

以上の、2つの文で、(aの値が)重複したものだけを、
結合して抽出したいのですが、どのように書けばよいでしょうか?
できれば結合結果に、ORDER BY 'e' と LIMITも加えたいです。
310NAME IS NULL:2010/09/10(金) 22:19:46 ID:???
>>309
結合しなくてもいんじゃないか?

ユニークid付けたtable1を作りました。

で、idでソートしたビュー
create view v_table1 as
select id,a,b from table1 order by id;

SQL短くなるので、ビューのまま書きます
select *
from
table1 a
where not exists
(select * from
(select *
from v_table1
where b=1 or b=2
group by a,b)b
where a.id=b.id)
and (b=1 or b=2);
311NAME IS NULL:2010/09/11(土) 18:37:55 ID:ijaraffT
大規模サイト向けのテーブル構造を勉強して実験したいのですが、
参考となる解説サイトってありませんかね?

ちなみに大規模サイトというのは、
mixiのような不特定多数のユーザが利用するSNSのようなサイトです。
312NAME IS NULL:2010/09/11(土) 19:19:04 ID:???
大規模SNSのテーブル設計は企業秘密じゃないかなあ
OpenPNEでもダウンロードして覗いてみたらどう
313NAME IS NULL:2010/09/11(土) 21:11:51 ID:???
昔、mixiサーバー不具合でソースが丸見えになってた時があったよね
まあ今は全然変わってるかもしれんが
314NAME IS NULL:2010/09/11(土) 21:38:44 ID:???
なんかの不具合でソース丸見えになる可能性ってあるの?
Apacheでスクリプトがスクリプトとして認識されてないようなコンフィグのミスとか?
315311:2010/09/12(日) 00:07:18 ID:???
>>312
OpenPNEのテーブル設計はとても大規模向けとは思えないんですよ。
せいぜい100〜200ユーザーが毎日アクセスしていたら
レコードが肥大化してパフォーマンスが悪くなると思います。

データベースの分割やパーティショニングを効果的に使って
万単位の利用を捌いているような設計の情報って、ネットで探せなくて・・・
316NAME IS NULL:2010/09/12(日) 01:01:06 ID:???
>>315

>万単位の利用を捌いているような設計の情報って、ネットで探せなくて・・・
探しかたが悪い。要素技術ならいくらでもある。

だが、要素技術だけマスターしてもどうしようもない。
レーシングカーでも飛行機でもロケットでもなんでもいいが多くの構成要素をもつ工学製品がどうやって作られているか、回り道のようでもいろいろ勉強してみろ。
要素技術ひとつひとつ完全にマスターするだけでなく、なにを選びなにを捨てるか、取捨選択=トレードオフ、全体のバランスをとるセンスを研くことがいかに大事か掴みとらないかぎり、大規模システムには手を出さないほうがいい。


ところで万単位って大規模か?
317NAME IS NULL:2010/09/12(日) 02:17:15 ID:???
その勉強方法がわからないから、訪ねてるんじゃないの?
318NAME IS NULL:2010/09/12(日) 02:23:46 ID:???
大規模サイトの開発・運用はいくつか本がでてるけど、
時期によって実際は最適解は変わってくるだろうから
システム全体を疎なつくりにしとくくらいじゃないかな。
事前にやれることといったら。
319NAME IS NULL:2010/09/12(日) 02:55:21 ID:???
>>314
見た目はそんな感じだった
mixi.jp/aaaaaa.plにアクセスするとPerlのソースがそのまま出てた

>>315
そういうのは企業秘密なのかなかなか情報ないね
技術セミナーとか出てみても質問してみてもうまいことぼかしてあって、具体的なことは教えてくれない
やはり中で働いてみるしかないんだろうな
320NAME IS NULL:2010/09/12(日) 08:44:38 ID:???
そのくせ、求人は「大規模サイト構築経験」とかいうの多いんだよな。

どこも試行錯誤なんじゃないのかなあ。
321NAME IS NULL:2010/09/12(日) 17:58:04 ID:???
Webサービスをやってる企業も手探りなのかな?
pixivはオープン後、数日でアクセスが増えてデータが肥大化したから
サーバ増強した?かなにか対策したという話を聞いたことある。

でも、こういう状態って運営経験無いとわからないよな。
自分達が作ったサービスが予想以上にヒットした時、
経験無いから対策できませんってなったら、せっかくの商機も失ってしまう。
322NAME IS NULL:2010/09/12(日) 18:03:22 ID:???
商機を失ってしまう会社はやっぱりあるよ。
そのへんは大規模経験があるベンダと付き合いがあるかどうかじゃないかなあ。
別に大きなベンダでなくともそれなりの経験があるだろうし。

ホスティングサービスに相談して解決できてしまうレベルだったりもするかもしれない。
323NAME IS NULL:2010/09/12(日) 18:10:24 ID:???
slideshareにアップされた大手サイトのドキュメント見てるけど、
それぞれ工夫していると言うのはわかるが、
具体的なテーブル構成や設計に関する事は書いてないな(当たり前かw

俺の中で意外だったのは、データベースを分けるのではなく、
テーブルを分けてレプリケーションする方法をしている方法が割と多かった
324NAME IS NULL:2010/09/12(日) 23:43:15 ID:???
>>317
だから
マニュアル坊やは何やってもダメなんで大規模に首つっこむなっての

試行錯誤できないやつはなにやってもダメだが
きまった手順のな分野にはそういう奴はいらんわけよ。

つまり、自分で乗り越えられることが先端にかかわるための必要条件。
十分条件でないぞ。
325NAME IS NULL:2010/09/13(月) 01:17:19 ID:???
第三者だけど、

A:マニュアルを見てきっかけを掴む
B:自分で試行錯誤してきっかけを掴む

では、明らかにBの方が効率が悪いぞ?
君は受験勉強で赤本買ったり、受験対策の過去問やったりしない?
326NAME IS NULL:2010/09/13(月) 05:55:36 ID:???
マニュアルに載っているようなことはマニュアルを見なくても
脳内の引き出しから出てくるのは前提条件だろ。
その上で、ネット上に散在している要素技術を蓄積し、かつ
それを必要な時に組み合わせて問題解決できることが求められてるんだよ。
327NAME IS NULL:2010/09/13(月) 10:11:35 ID:???
自らの成功体験を語っているはずなんで全部正解だと思う。
ただ、命題からちょっとずつズレているだけ。

大規模だと普通は、Oracleとか使うだろ。l
で、マニュアルに載ってない情報を教えてもらう流れ。
328NAME IS NULL:2010/09/13(月) 14:38:51 ID:???
>大規模だと普通は、Oracleとか使うだろ。l

これは違うと思う。
329NAME IS NULL:2010/09/13(月) 14:43:30 ID:???
あ、そうなんだ。俺、引退して3年くらいたつからな。
330NAME IS NULL:2010/09/13(月) 15:30:47 ID:???
引退ってお前何歳だよw
331NAME IS NULL:2010/09/13(月) 16:01:17 ID:???
>>325
> 第三者だけど、
>
> A:マニュアルを見てきっかけを掴む
> B:自分で試行錯誤してきっかけを掴む
>
> では、明らかにBの方が効率が悪いぞ?

ゆとり乙

> 君は受験勉強で赤本買ったり、受験対策の過去問やったりしない?

教科書なんてない未開の分野に乗り出す人間と後からついてくる人間の違いがわからん奴になにいっても無駄だな。

大規模システムにきまり切った定石なんてない。みな一品もの。
スケールアップしか手がないシステムならそれでいくしかないし、スケールアウトできる切口があればスケールアウトすればいい。
トレードオフのポイントみつけるのは技術センスが必要。ダメな奴はダメ。ほんとうにセンスのアリ無し。

ただし大規模の設計センスがないからといって技術レベルが低いってことじゃない。
向き不向き。全体のトレードオフを見つけるのがうまい奴は得てして細かい実装には拘らないことがおおいから
実装者としては中級の場合もある。
質問者はとっかかりが掴めないといってるが、それは向いてないんだから別の方向を探したほうがいい。
別の道を歩きながら経験積んで大規模に立ち向かうセンスが身につくかもしれないし、
細部に拘った実装で名をあげるかもしれないし
332NAME IS NULL:2010/09/13(月) 16:43:42 ID:???
Web前提で書いてるだろ。
333NAME IS NULL:2010/09/13(月) 17:32:39 ID:???
Connector/Netっていつ頃から MySQL 5 以前を
サポートしなくなったのですか?
MySQL 4 に .net でつなぐ方法はありますか?
334NAME IS NULL:2010/09/13(月) 17:49:33 ID:???
>>331
お前みたいな古い根性論の奴多いな。
「俺の背中を見て仕事を覚えろ」ってやつ?www

チームにとけ込めない人間ならそれで良いだろうな。
何が「一品もの(キリッ」だw

現実には定石はあるし、マニュアルも作ってる。
ただお前は知らないだけ。違うか?人に教えられる能力がないだけなんだよ。
335NAME IS NULL:2010/09/13(月) 21:38:56 ID:???
>>323
PARTITION BY じゃね?
336NAME IS NULL:2010/09/13(月) 21:42:21 ID:???
>>331
140字に収めて下さい
337NAME IS NULL:2010/09/14(火) 02:44:48 ID:???
>>334
>現実には定石はあるし、マニュアルも作ってる。

じゃあ、出してあげればw
338NAME IS NULL:2010/09/14(火) 04:00:15 ID:???
根性論なんて、って言っているやつも分かって言ってると思う。字面みて、ちょっとカチンと来ているだけだろ。

枯れた技術は、抑えるのは当然として、新しいことやろうとすると、やっぱ工夫しないとダメだし。

すごく端的かもしれんけど、戦闘機を国産で作ろうとなったとき、既にアメリカにある技術だから、教えてもらえばいいってことにはならない。
同じように大規模でもサクサク動く何かを作ろうとしたときに、別の会社にノウハウあっても意味はない。

みんな正解を言いあって、ケンカしているのがホント解せないわ。
おまえは偉そうだから腹が立つ、って言わないと。そこは。
339NAME IS NULL:2010/09/14(火) 12:22:56 ID:???
>>338
> 根性論なんて、って言っているやつも分かって言ってると思う。字面みて、ちょっとカチンと来ているだけだろ。

「現実には定石はあるし、マニュアルも作ってる。」なんて書いてる >>334
が分かってやってるはずない。

>現実には定石はあるし、マニュアルも作ってる。

そのマニュアル出してみろよ。
そのマニュアル読めば素人でもDB100台規模のシステム組んで運用出来るんだろうな?
その定石ってのは、DB100台から1000台に拡張するときもなんの問題もなく適用できる定石なんだろうな?

そんなもんあるわけねえだろ。
多少失敗しながら自分で考えて技術身につけないと、100台規模から1000台規模になんて拡張できねえんだよ。
10倍のシステム拡張成功させた人間が、エッセンスを言葉でマニュアルに書いても、
それを本当に理解できるのは同等レベルのエンジニアだけ。そういうエンジニアは間違いなく膨大な時間を使って実験して
膨大な失敗をしている。失敗を話さないからスゲーって思うだけ。ものすごい時間を投資して勉強してんだよ。

マニュアル読めばできるなんて考えてる馬鹿が多いから、システム開発は上流から下流まで全部ボロボロになるんだよ。
340NAME IS NULL:2010/09/14(火) 12:56:04 ID:???
おちつけよ、まぁもっとやれ。
341NAME IS NULL:2010/09/14(火) 13:26:10 ID:???
>>339
そんなマニュアル会社の大事な財産なんだからこんなところで出すかよ アホか
おまえみたいに自宅鯖の前で唸ってるだけじゃないんだよ
342NAME IS NULL:2010/09/14(火) 15:20:04 ID:???
>>341
> そんなマニュアル会社の大事な財産なんだからこんなところで出すかよ アホか


>>338
>根性論なんて、って言っているやつも分かって言ってると思う。

な、
こいつ 341=334 分かってないだろ

ちょっと煽ると本気になるってガキかよ >>341,334
343NAME IS NULL:2010/09/14(火) 15:23:32 ID:???
釣りや皮肉に
まともに反応されると
スレがつまらなくなるよ >>341
344NAME IS NULL:2010/09/14(火) 18:08:55 ID:c5ysreRD
質問させてください。
MySQL板とLinux板で迷ったのですが、同じものを使っている人がいるかもと思いこちらに質問させていただきます。
もしLinux板の方が該当するというのであれば移動します。

mMeasure(1.0.7)をインストールし、ブラウザに表示させようとしたところ文字化けして全く読めませんでした。
該当index.php(/usr/local/mmeasure/web/)をnkf -g コマンドで調べてみた所EUC-JPで書かれているようでした。
で、このサイト(http://blog.livedoor.jp/kuma_note/archives/51486050.html)等を参照に、httpd.confにAddDefaultCharset EUC-JPを追記しても、又はコメントアウトしたり他のエンコードを入れたりしても解決しませんでした。
勿論FirefoxやOperaのブラウザ上で文字コードを色々と変えてみたのですがやはり解決しませんでした。
ずっとこれで悩んでいて、色々と試したのですが解決しません。
どのようにすればこの文字化けは解決するのでしょうか?

自分の環境はcentOS5.5、JCode.pm;2.07、RRDTool:rrdtool-1.4.4、MySQL5.0.77です。
Opera、firefoxは最新版です。

なおhttpd.confには、
Alias /mmeasure/ "/usr/local/mmeasure/web/"
<Directory "/usr/local/mmeasure/web/">
???
AddDefaultCharset EUC-JP
</Directory>
と記述し、該当の場所にディレクトリは存在しますし、http://localhost/mmeasure/でトップページへ行けるのでエイリアス等は通っていると思います
345NAME IS NULL:2010/09/14(火) 22:56:45 ID:l/VJf2+2

LinuxにMySQL5.0.Xインストールしたんですけど、
InnoDBでできる0とか1とかのファイルって何でしょうか?
全く更新されてないようなのですが・・・。

/etc/my.cnfはほぼデフォルトのままです。

346NAME IS NULL:2010/09/14(火) 23:31:17 ID:???
>>345
InnoDBのトランザクションログファイル
InnoDBのテーブル作ってINSERT/UPDATEしたら更新される
捨てちゃダメ
347NAME IS NULL:2010/09/14(火) 23:34:57 ID:???
>>344
対応ディストリビューション:Red Hat Linux 9
ってすごいな。どんだけ更新されてないんだ

ファイルをUTF-8に変換して、UTF-8で動くように
自力で改造した方が早いかもしれない
348499:2010/09/15(水) 00:41:07 ID:???
数値型
349499:2010/09/15(水) 00:47:33 ID:???
初歩的な質問過ぎて逆にググってもでてこないから教えてください
数値型っていろいろあるけど、整数ならINT使うべきなんでしょうか?
 INT
 TINIINT
 SMALLINT
 MEDIUMINT
 BIGINT

もちろん、INT型の範囲を超える値を使うなら
BIGINTにするけど、TINYINTやSMALLINTはいらないコですか?

それとも、テーブル設計時にサイズが例えば128桁未満で確定してるなら
TINYINTのカラムにすべきですか?

話それるけど、Javaの場合、JVMが最適化してくれるから
short型とか使わずに、int型で宣言した方が性能でるってのがあって
MySQLとか各種データベースもそういうのあったりすんのかなーっていう質問です。
350NAME IS NULL:2010/09/15(水) 00:58:58 ID:???
>>349
そのテーブルが何千万何億レコードにもなる/なりそうで、
とあるカラムに格納される値が1byteとか2byteで収まるのなら、
そして出来るだけディスク消費量を抑えたいのなら、
tinyとかsmallとかを使う。

百や千ていどのレコード数なら、あんま気にしなくてもいいよ。
351344:2010/09/15(水) 19:44:27 ID:KfYZPT9x
>>347
そうなんですよ
いったいどんだけ・・・と言いたいですね
MySQL5.0や5.1でそのまま使うと使えず、設定をいくつか変えなければ利用できず、その為に2週間費しました

>ファイルをUTF-8に変換して

nkfコマンドで全て変更するという事でしょうか?
確かに自分もUTF-8に変更する道も考えたのですが、ファイル数が多く、ちょっと萎えていてApacheの設定で即解決するならばそれの方がいいと思いまして
nkfコマンドで全てUTF-8に変えようかとも思いましたが、おそらく駄目だと思い止めました

やはりどうもApacheの設定の問題のような気もしてきました
一応Apache板の方に質問してみます
それで駄目な時は全部ファイル毎にUTF-8で書き直してみます
352NAME IS NULL:2010/09/16(木) 09:48:02 ID:???
なあ、「UTF-8対応」って要するに文字コードがUTF-8で保存されていればOKな話なの?

スクリプト中に文字コード依存するような、例えばPHPだったらmb_encoding関数とか、
Perlだったらjcode.perlとか使ってるような処理がある時には修正するってくらい?
353NAME IS NULL:2010/09/16(木) 13:21:39 ID:???
MySQL Clusterに関してですが、マネージメントノードを複数台にする設定方法など、参考URL等でもいいので教えていただけませんか?
ネットにある情報みても、マネージメントノードは1台構成の設定サンプルしか見当たらなかったので。

よろしくお願いします。
354NAME IS NULL:2010/09/17(金) 09:33:21 ID:???
Server version: 5.1.46 OS:WinXP

grantによる権限の付与について教えてください

個別の権限を与えるなら、例えばselectやinsertをtestデータベースにある全てについて与えるなら
grant select,insert on test.* to testuser@localhost identified by'testuser';

これは出来たんですけどGlobal権限のFile権限を付与するにはどうしたらよろしいの
でしょうか?

grant file to testuser@localhost identified by 'testuser';
だと
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'to te
stuser@localhost identified by 'testuser'' at line 1

というエラーに成ります
355NAME IS NULL:2010/09/17(金) 10:12:36 ID:???
on *.*
356NAME IS NULL:2010/09/17(金) 10:28:25 ID:???
>>355

grant file on *.* to testuser@localhost identified by 'testuser';
で出来ました。

有難うございます
357NAME IS NULL:2010/09/18(土) 17:34:12 ID:???
DB作ってそのDBを更新するユーザを作りたいんだけど、
ユーザテーブルにユーザを追加して、権限をSelect_priv Insert_priv Update_priv Delete_privのみYにしたけど、
いろんなDBにアクセスできるしルート並に更新とかやり放題なんだけど、
どうやって使用するDB制限すればいいの?
あと、権限関係の知識ないから簡単にチュートリアル的に説明してくれるサイトがあればおしえてほしい。
358NAME IS NULL:2010/09/18(土) 17:46:31 ID:???
revoke all on *.* from testuser@localhost;
grant all on test.* to testuser@localhost;
あとはぐぐれ
359NAME IS NULL:2010/09/18(土) 19:18:32 ID:???
>>358
行けたー、そしてググって意味も理解した。
サンクス。
360NAME IS NULL:2010/09/19(日) 21:04:23 ID:???
phpmyadminで文字セット変えたくて
$cfg['Lang'] = 'ja-sjis';
$cfg['DefaultLang'] = 'ja-sjis';
$cfg['DefaultCharset'] = 'ja-sjis';
$cfg['DefaultConnectionCollation'] = 'ja-sjis';
ってしたら 言語ファイルが登録されていません: ja-sjis 
って出たんだけど、どうすればいいかわからないから知ってる人教えて。

スレ違いだったらスマソ。
phpスレで聞くのも違う気がするし、どこで聞いていいのかわからない。
361NAME IS NULL:2010/09/19(日) 21:35:12 ID:sGWKjnuL
いろいろググってみたのですが、結局解決しなかったので質問させてください。
MacとCentOSでMySQLを運営しようかと思っているのですが、
Macで作っていたInnoDBのtableをCentOSにまるごとコピーをして見たところ、
show tableコマンドでは存在が確認できるのですが、show fields tableNameだと、
Table 'tableName' doesn't exist
となってしまいます。パーミッション関係もmysqlに変更しているし、myisamテーブルは問題なく表示されます。
コピーをとるときも、MacのMySQLをきちんと落としてからフォルダごとコピーしたので、
ファイルそのものに問題はないと思うのですが?
repairをしても、Table 'tableName' doesn't existってでるだけで.....
どなたか解決方法ご存じないでしょうか?
362NAME IS NULL:2010/09/19(日) 22:09:11 ID:???
ダンプしてリストアすればいいような気がする
363NAME IS NULL:2010/09/19(日) 22:20:21 ID:sGWKjnuL
>>362
早速ありがとうございます。でも
mysqldump: Got error: 1146: Table 'データベース名.テーブル名' doesn't exist when using LOCK TABLES
となってダンプできませんでした。
364NAME IS NULL:2010/09/19(日) 23:27:57 ID:???
>>360
よく知らんけどさあ、例えば「phpmyadmin $cfg['Lang']」でぐぐってみたら、
ttp://atm-tkd.sakura.ne.jp/phpstudy/pma/rqgpmausage.html
こういうページがあってさ、そこ見ると、
>(d)文字コードの変更
>$cfg['DefaultLang'] = 'en-iso-8859-1';
>  ↓
>  $cfg['DefaultLang'] = 'ja-sjis';
>
>$cfg['Lang'] = 'ja-sjis';
>
>$cfg['DefaultCharset'] = 'iso-8859-1';
>  ↓
>$cfg['DefaultCharset'] = 'SHIFT_JIS';

みたいに、同じシフトJISでもDefaultLangとDefaultCharsetに与える値は違うみたいだよ。
もちっと調べてみたら?
365NAME IS NULL:2010/09/19(日) 23:32:38 ID:???
366NAME IS NULL:2010/09/20(月) 00:15:33 ID:???
>>363
改行コードを合わせてないだけじゃ・・・
367NAME IS NULL:2010/09/20(月) 10:26:29 ID:???
>>363
あの。。。。。。。
元のMac側でダンプするんだよ???
368NAME IS NULL:2010/09/20(月) 14:14:51 ID:???
>>364
ダメでした。
$cfg['DefaultLang'] = 'ja-sjis';
$cfg['Lang'] = 'ja-sjis';
$cfg['DefaultCharset'] = 'SHIFT_JIS';
実は投稿前に一応、ja-sjis、sjis、SHIFT_JISと試してみたのですが、
どれも駄目だったのです。
369NAME IS NULL:2010/09/20(月) 21:01:51 ID:???
>>368
サーバーの状況がまったく書かれてないね。

show variables like 'char%'; の結果と、my.cnf(あるいはmy.ini)のdefault-charcter-setの設定値くらい書かないと。
あと、skip-character-set-client-handshakeの設定をしたか?とか。
370NAME IS NULL:2010/09/22(水) 06:24:03 ID:???
mysql workbench 5.2.28(ga)がリリースされたばかりだが、
サーバーインスタンスを作る画面で下部の情報が表示されないし
startかけたら
Could not start server: expected a character buffer object
というのが出る。
5.2.27に戻すと、うまくいくのだが、本家、バグってないかい?
371NAME IS NULL:2010/09/23(木) 12:31:57 ID:xYi5pgu4
372NAME IS NULL:2010/09/24(金) 03:13:22 ID:QTcdf6KB
MySQL Workbech 5.2.28CE使ってます。
7個テーブルを作ったのですが、ForwardEngineerしても
そのうち最初の3個しかテーブルが作られていません。
うまくいかない原因はどんなことが挙げられるでしょうか?
373372:2010/09/24(金) 03:29:59 ID:QTcdf6KB
自分でCreateTable文をコマンドラインからぶち込めばよかったのか。。。

ERROR 1005 (HY000): Can't create table 'mydb.log' (errno: 121)
と言われます。
googleで調べると、外部参照の元と先の型が違うときのエラーのようですが
そのような間違いは犯していませんでした。
どうしてなのでしょう?
374372:2010/09/24(金) 04:01:10 ID:QTcdf6KB
Edit SchemaでDB名を変えると、今まで問題の無かった
enum文でもエラーがでるようになっちゃいました。。。
どうなってるんでしょうコレ。偉い人教えてください。
375372:2010/09/24(金) 04:05:18 ID:QTcdf6KB
>>374 の症状は勘違いでした。。。
頭が混乱してきた><
376NAME IS NULL:2010/09/24(金) 04:40:12 ID:???
ディスク容量とか、大丈夫ですか?
377NAME IS NULL:2010/09/24(金) 08:53:54 ID:???
>>373
「そのような間違いは犯していませんでした」って言ってもなぁ…
実際間違ってるからエラー食らってるんだろ。

参照する側される側、両方のshow create tableの結果を貼った方が話が早いんじゃ?
378NAME IS NULL:2010/09/24(金) 09:00:48 ID:???
MySQL Workbenchの品質がちょっとアレなんじゃないの
379372:2010/09/24(金) 18:01:16 ID:QTcdf6KB
ちょっと長いですが、workbenchから出力されたSQLを貼ります。
4つ目のloginlogで失敗します。

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`user`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`user` ;


CREATE TABLE IF NOT EXISTS `mydb`.`user` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NULL ,
`password` VARCHAR(8) NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `name_UNIQUE` (`name` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = 'ユーザーアカウント情報';
380372:2010/09/24(金) 18:03:08 ID:QTcdf6KB
-- -----------------------------------------------------
-- Table `mydb`.`profile`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`profile` ;

CREATE TABLE IF NOT EXISTS `mydb`.`profile` (
`id` INT NOT NULL AUTO_INCREMENT ,
`user_id` INT NOT NULL ,
`body` BLOB NULL ,
PRIMARY KEY (`id`) ,
INDEX `user` (`user_id` ASC) ,
UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC) ,
CONSTRAINT `user`
FOREIGN KEY (`user_id` )
REFERENCES `mydb`.`user` (`id` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = 'プロフィール情報';
381372:2010/09/24(金) 18:04:44 ID:QTcdf6KB
-- -----------------------------------------------------
-- Table `mydb`.`usersetting`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`usersetting` ;

CREATE TABLE IF NOT EXISTS `mydb`.`usersetting` (
`id` INT NOT NULL AUTO_INCREMENT ,
`user_id` INT NULL ,
`mail_message` TINYINT(1) NULL DEFAULT true ,
`mail_reply` TINYINT(1) NULL DEFAULT true ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC) ,
INDEX `user_id` (`user_id` ASC) ,
CONSTRAINT `user_id`
FOREIGN KEY (`user_id` )
REFERENCES `mydb`.`user` (`id` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = 'ユーザー設定';

382372:2010/09/24(金) 18:06:11 ID:QTcdf6KB

-- -----------------------------------------------------
-- Table `mydb`.`loginlog`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`loginlog` ;

CREATE TABLE IF NOT EXISTS `mydb`.`loginlog` (
`id` INT NOT NULL AUTO_INCREMENT ,
`user_id` INT NULL ,
`login_date` TIMESTAMP NULL ,
`ip_address` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
INDEX `user_id` (`user_id` ASC) ,
CONSTRAINT `user_id`
FOREIGN KEY (`user_id` )
REFERENCES `mydb`.`user` (`id` )
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
383NAME IS NULL:2010/09/24(金) 18:35:41 ID:???
ほんとだエラーでた

ERROR 1005 (HY000): Can't create table 'mydb.loginlog' (errno: 121)

> perror 121
MySQL error code 121: Duplicate key on write or update
Win32 error code 121: セマフォがタイムアウトしました。
384NAME IS NULL:2010/09/24(金) 19:03:06 ID:???
俺にはわからん。
解析班の到着を待とう。
385372:2010/09/24(金) 22:03:08 ID:QTcdf6KB
ちなみにMySQLServerはVer5.1です。
386372:2010/09/24(金) 22:36:13 ID:QTcdf6KB
CONSTRAINTをコメントアウトしたらうまくいった気がします。。。
まだ様子見ですが。。。
387372:2010/09/24(金) 22:45:36 ID:QTcdf6KB
CONSTRAINT名の重複をしないように書き換えたら、たぶんうまくいったみたいです。
388NAME IS NULL:2010/09/24(金) 23:10:18 ID:???
なるほどマニュアルに書いてあった。

http://dev.mysql.com/doc/refman/5.1/ja/innodb-foreign-key-constraints.html
もし CONSTRAINT symbol 条項が与えられると、symbol 値はデータベース上で固有である必要があります。

Workbenchがこの条件をチェックしてくれないってことか。
Workbenchのバグですなー
389NAME IS NULL:2010/09/24(金) 23:30:35 ID:???
Workbenchが勝手に作るSQLが、それらなんだ?
つかえねーw 使ったことないけどw
名前を付ける仕組みがダメすぎるな。

でも`mydb`.`profile`のCONSTRAINT `user`だけ命名パターンが違う気がする
なんでだ?
390372:2010/09/25(土) 02:48:25 ID:oJ/2I9fC
GUI上に、CONSTRAINT名を指定する欄が見当たらないんですよね。。。
なんかの理由で自動生成されてる気がします。
391NAME IS NULL:2010/09/25(土) 11:04:54 ID:???
指定するところあったよ

ER図でテーブルをダブルクリック
→ 下部に出たテーブル定義ペインでForeien Keysタブを選択
→ Foreign Key NameがCONSTRAINT名に相当

いずれにせよSQLファイルにフォワードするときに
Workbenchの方で一意性をチェックすべきだな
392361:2010/09/25(土) 22:22:33 ID:KgxIgKBX
アドバイスいろいろありがとうございました。
いろいろやってみた結果、奇妙なことがわかりました。
table * doesn't existsとでたテーブルのファイル名の大文字を小文字にしたら全てデータが見えるようになりました。
Macが大文字小文字を区別していないことは知っていましたが、そこら辺が原因なのかもしれません。
ただ、今CentOS上で大文字小文字を区別していない状況です。

なんか気持ち悪い。
とりあえずlower_case_table_names=1と設定しておいて、ファイル名を全て小文字に。
そのごlower_case_table_names=1をコメントアウトして、alter tableにて全て大文字のある元のファイル名に変更
これでなんとかなりました。

なんだったんだろ?
393NAME IS NULL:2010/09/25(土) 23:12:14 ID:???
なんだったんだろって
十分正確に把握していると思うけど
394NAME IS NULL:2010/09/25(土) 23:15:46 ID:???
なんだったんだろうって、ほんとにMacが大文字小文字を区別してないんだったら、
その点では同じであるWindowsの場合と同じなんでしょ。
http://dev.mysql.com/doc/refman/4.1/ja/moving.html
395361:2010/09/25(土) 23:32:35 ID:KgxIgKBX
さらに面白い現象を発見
ほとんどinnodbにしてるんだけど、なぜかinnodbのくせに同名の.MYIと.MYDがあるテーブルがある。
こいつらは、そのまま読み込むことができるけど、renameができない。

ほんとになんなんだろ?
>>393
偶然見つけただけだから、把握なんてできてないよ。
396372:2010/09/25(土) 23:56:12 ID:???
>>391
profileテーブルだけは、その値が使われてないんですよね。。。
CONSTRAINT名は、参照先のテーブル名を使う、でも重複してたら
Foreign Key Nameを使う、という処理をしてるのかもしれないですね。
397NAME IS NULL:2010/09/26(日) 14:16:36 ID:???
設計について質問です。よろしくお願いします。
MySQLとPHPを利用して、ある資格試験の過去問学習サイトを作成する予定です。

このサイトでは、ユーザー登録(ログイン)機能を設けて、ログイン中のユーザーには、
その人のこれまでの得点や各問題の正解率などを記録・表示できる仕様にしたいと考えています。

ユーザーごとに得点や正答率などを記録するには、一つのテーブルに、
各ユーザーごとのカラムを設けて、カラム単位でユーザーの成績などを
記録した方が良いのでしょうか?

それとも、各ユーザーにつき、一つのテーブルを割り当てるのが良いのでしょうか?

テーブルとカラムの設計のヒントをご教授頂けるとありがたいです。

なお、プログラミングについては、これまで掲示板などの作成経験があるくらいの初心者です。
よろしくお願いします。
398NAME IS NULL:2010/09/26(日) 15:05:37 ID:???
>>397
>一つのテーブルに、
>各ユーザーごとのカラムを設けて、カラム単位でユーザーの成績などを
>記録した方が良いのでしょうか?
>
>それとも、各ユーザーにつき、一つのテーブルを割り当てるのが良いのでしょうか?

どっちもやらないな。
ちなみに、そういう話はMySQL特有のことではなく、RDB問わずの設計の話だから、
このスレは不適じゃないか?

DB設計を語るスレ 3
http://hibari.2ch.net/test/read.cgi/db/1269585561/
399397:2010/09/26(日) 16:48:44 ID:???
>>398 すみません。
DB板の他スレを見たところ、過疎のスレが多いので、「MySQL総合」の
こちらで質問させて頂きました。>>398のスレも8月12日以降レスが無いので・・・。

「どっちもやらない」ということは、ユーザー管理のテーブル、成績だけのテーブルを使って、
テーブル間で結合などの処理をするのが適切なのでしょうか?
400NAME IS NULL:2010/09/26(日) 17:18:26 ID:???
会員毎にカラムなんて、ましてやテーブルなんて作らないすよ。

>ユーザー管理のテーブル、成績だけのテーブルを使って、
>テーブル間で結合などの処理をするのが適切なのでしょうか?

そんな感じが普通だと思う。例えばあくまで一例だけど。

user ( //会員テーブル
 id //会員ユニークID
 name
 age
etc.....
)

exam ( // 試験テーブル
 exam_id // 試験(模試)ID
 date_done // 実施日
etc.....
)

question ( //問題テーブル
 exam_id //試験(模試)ID
 quest_no // 試験内問題ID
 quest_id // 問題(全試験でユニークな)ID
 point //配点
)

result ( //結果テーブル
 user_id
 quest_id
 result // 正解したか否か
)

とか。
正解率は都度計算で出すか、
正解率みたいな集計値の記録テーブルを設けるか…
401397:2010/09/26(日) 18:20:36 ID:???
>>400 ありがとうございます!!とても参考になります。
正規化やリレーショナルな操作が苦手なため
考えがもやもやしていましたが、目の前の霧が晴れました。
400様の教えを元に試行錯誤してみたいと思います。
本当に感謝です。400さん398さんに幸ありますように!
402NAME IS NULL:2010/09/26(日) 22:31:02 ID:???
InnodbおんりーのDB鯖立てなきゃなんですが、
実メモリ内に収まる範囲で運用できてるかどうかがわかりません…
簡易チェックツールとかありませんかね?
403NAME IS NULL:2010/09/27(月) 21:46:48 ID:???
MySQLのレプリケーションって、サーバをRAIDしているようなもんだと
思っているのですが、認識的に正しいですか?
404NAME IS NULL:2010/09/27(月) 23:31:03 ID:???
うーん自分のなかでそう理解するだけならいいけど
その認識で他の人に説明するといろいろ誤解を招くと思う。

RAID1は同時に両方に書くけど
レプリケーションはマスタに書いた後スレーブに書くから、
マスタが壊れるタイミングによってはスレーブに欲しいデータが
存在しない場合がある、といったところが違う
405NAME IS NULL:2010/09/28(火) 03:10:35 ID:???
すみません。

Aというテーブルに、ユーザーのメールアドレスをクエリにしてデータの照会を行い、
受け取った配列をBというテーブルにINSERTしたいと思っているのですが
\"$row[id]\",\"$row[pass]\"という風にしてSQL文を発行しても、Bに挿入されません。
print_r()で見てみると "","" のようにデータが空になってしまっています。

以前、似たようなケースでやった時はデータを入れることができたのですが…。
どのようにすればテーブルBにデータを移せるのでしょうか?
406NAME IS NULL:2010/09/28(火) 04:03:42 ID:???
>>405
MySQL関係ないやん。
$row[id]が実は無いとかでなければ"{$row[id]}"で展開できる。
てか文字列は""じゃなくて''で囲ったほうが面倒ないよ。
あとSQLハードコードするならヒアドキュメントのがすっきり書けるよ。
407NAME IS NULL:2010/09/28(火) 07:24:37 ID:XeiSxRUI
>>405
PHP?知らないし、今回の件と直接関係ないけど
プリペアードステートメントとかプレイスホルダを
調べると(まわりの人が)幸せになれると思う
408405:2010/09/28(火) 13:43:45 ID:???
すみませんスレ違いのようなのでこの辺りにしておきますが

$result = $dbh->query($sql);
$row = $result->fetchAll(PDO::FETCH_ASSOC);

で受け取った配列が

Array ( [0] => Array ( [id] => 0000 [pass] => 0000 [mail] => [email protected] [birth] => 2000/6/15 [sex] => 1 [hash] => 2e910fer4bd1e1caafg61781 )

という感じで、これを

$insql = "insert into `user` value(\"{$row[id]}\",\"{$row[pass]}\",\"{$row[mail]}\",\"{$row[birth]}\",\"{$row[sex]}\")";
$stml = $dbh->query($insql);

としてクエリ発行しているのですが
print_r()でリクエストの中身を表示させると

PDOStatement Object ( [queryString] => insert into `user` value("","","","","") )

このように全部空になってしまっているんです。
PHP側の問題のようなのでそちらで質問します。
どうもでした。
409NAME IS NULL:2010/09/28(火) 16:19:41 ID:???
>>408
プレースホルダとか使うのが間違いないけど、""内に直接変数書かないようにしたほうがいいんでない?
410NAME IS NULL:2010/09/28(火) 23:00:17 ID:???
query ok とかってのの表示するしないの変更ってできませんか?
大量に登録するとき表示で時間かかったりするんですが
411NAME IS NULL:2010/09/29(水) 04:33:21 ID:???
表示で時間がかかる???
ありえんだろ。

sprintf(buff,"Query OK, %ld %s affected",
(long) mysql_affected_rows(&mysql),
(long) mysql_affected_rows(&mysql) == 1 ? "row" : "rows");

sprintf(buff,"%ld %s in set",
(long) mysql_num_rows(result),
(long) mysql_num_rows(result) == 1 ? "row" : "rows");
412NAME IS NULL:2010/09/29(水) 07:21:00 ID:???
コンソールへの出力は、するとしないとで速度が全然違うよ。
(ディスク上の)ファイルに出すのは、あまり速度の足引っ張らないんだけどね。
413NAME IS NULL:2010/09/29(水) 09:16:34 ID:???
ひょっとして、1行ずつのInsertで大量登録、つーことか・・・
414NAME IS NULL:2010/09/29(水) 14:03:13 ID:lt2zT56o
32bitのIPアドレスを int に入れていたのですが、
IPv6 の 128bit を入れる場合、bigint だと 64bit なのでちょっと困っています。

bigint より大きい 128bit が入る型は無いのでしょうか?


素人な質問で申し訳ないです・・。bigintより上を探せなくて。
CentOS5.5、MySQL5.0 の 64bit マシンです。
415NAME IS NULL:2010/09/29(水) 15:34:34 ID:???
整数にしようってのがアレな気がするけど、
まあ、DECIMAL?
416NAME IS NULL:2010/09/30(木) 09:20:27 ID:???
ポスグレだと、ネットワークアドレスデータ型っていうのがあるんだね。
MySQLは、そういうのはないし、整数変換の inet_aton は、ipv4のみサポート。
417NAME IS NULL:2010/10/01(金) 07:38:00 ID:xMdr0/PC
Oracle、MySQLのサポートを値上げ

Oracle MySQL increasing support pricing
http://www.commandprompt.com/blogs/joshua_drake/2010/09/oracle_mysql_increasing_support_pricing/
418NAME IS NULL:2010/10/02(土) 08:29:20 ID:???
特定のテーブル(testtbl)だけアクセス出来るユーザ(guest)を作ろうとしました。

GRANT SELECT ON testdb.testtbl TO guest IDENTIFIED BY 'guest';としたら、
ERROR 1142 (42000): GRANT command denied to user 'guest'@'localhost' for table 'testtbl'と返ってきます。
Message: コマンド %s は ユーザー '%s'@'%s' ,テーブル '%s' に対して許可されていません 、らしいのですが、
よく分りませんでした。

どうすれば特定テーブルだけにアクセスできるユーザを作れるのでしょうか?
419418:2010/10/02(土) 08:39:15 ID:???
失礼しました。

grant権限の無いユーザで、grantしてました。 orz
420NAME IS NULL:2010/10/03(日) 03:09:31 ID:???
初歩的なことですが、教えてください。

VARCHAR(32) PRIMARY KEY DEFAULT NULL

上記が通らないのですが、なぜ主キーをつけると
VARCHARにはDEFAULT NULLがつけられなくなるの
でしょうか。

PRIMARY KEYによりNOT NULL制約がつけられている
ので、ここに値を入れない限りはエラーになる
(insertやupdateはできない)というカラムにしたい
のですが、ご教示いただけますと幸いです。

よろしくお願いします。
421NAME IS NULL:2010/10/03(日) 06:45:07 ID:???
俺も初心者ですが。

primary key は、NULLが認められていない
default null は、NULLが認められていないカラムには設定不可

ダブルでNG

>なぜ主キーをつけるとVARCHARにはDEFAULT NULLがつけられなくなるのか

varchar だからダメっていうわけでなく、上記理由でNG intでもダメだし

最後の文の意図がまったくわかりませんでした。
読み取れるところから、
>insertやupdateはできない

別のdatabaseに表を作って、select権限のみgrantすればいいんじゃないですかね。
参照専用のなにか仕組みがあるんだろうか?
422NAME IS NULL:2010/10/03(日) 08:28:21 ID:9zQ6kT+B
>>421 >>420 さんが理解できるでしょうか?

PRIMARY KEY の要件を無視しているお話しだったので、理解してもらえないと私は思っています。

もしくは釣りだったかもしれません。

423420:2010/10/03(日) 15:16:54 ID:???
すみません。
釣りではなく素で質問させていただきました。

主キーは絶対にNULL以外を入れなければいけないのにも
かかわらず、DEFAULT NULL制約をつけるということが矛盾
しているのはわかるのですが、このカラムに何も指定をしな
いでINSERTをかけると、空文字が入ります。
これを防ぎたいと思い質問させていただいたのが趣旨と
なります。

プログラム側で、間違えて主キーカラムを指定しないで
INSERTをしてしまった場合、DB側でエラーにしたいの
ですが、無理であればプログラム側での制御にします。
424NAME IS NULL:2010/10/03(日) 15:30:33 ID:???
その空文字はNULLではないでしょう。
425NAME IS NULL:2010/10/03(日) 16:00:16 ID:???
426NAME IS NULL:2010/10/03(日) 16:10:40 ID:???
もしかしてこれか?

・DEFAULT 値は定数でなければならず、関数や式を使用することはできない。
DEFAULT 値が指定されていない場合、そのカラムには、次の方法で、MySQL によって DEFAULT 値が自動的に割り当てられる。
値として NULL を取れるカラムの場合、デフォルト値は NULL になる。
NOT NULL として宣言されているカラムの場合、デフォルト値はそれぞれのカラム型によって決まる。

PRIMARY KEYはNOT NULL→だから暗黙にDEFAULT ''

だとしたらひでぇw
もし空文字列がキーとして不要なのであれば、CHECK制約ではじくとか。
427NAME IS NULL:2010/10/03(日) 16:12:48 ID:???
MySQLはCHECK制約ないよ
428NAME IS NULL:2010/10/03(日) 16:18:15 ID:9zQ6kT+B
>>423-424

> このカラムに何も指定をしないでINSERTをかけると、空文字が入ります。

空文字とNULLの違いをご存知だと言う前提でレスします。


検査制約( CHECHK でしたっけ? )を使えば良いと考えました。

けれども、MySQLでは、検査制約は可能なのでしょうか?

手元にマニュアルが無いので適切に回答できなくてスマソ
429NAME IS NULL:2010/10/03(日) 16:23:24 ID:???
primary keyをセットした時点で重複は弾かれるけど、
  id varchar(10) not null default '' primary key
これだと、最初の1レコードのみは主キーが空文字で登録できてしまうね。

要するにid bigint unsigned auto_increment最強。
430420:2010/10/03(日) 16:25:29 ID:???
皆さま。
ありがとうございます。

状況としましてはおっしゃるとおり、PRIMARY KEYはNOT NULLで
あるため、自動的にDEFAULT '' が適用されてしまうことの対応策
を教えていただきたく、書き込ませていただきました。
空文字で入ってしまいますと余分なデータが入ってしまうためです。

現状のサーバ設定を崩すことはできないため、なんとか教えてい
ただいたことを参考に試行錯誤してみたいと思います。

取り急ぎ、御礼申し上げます。
431424:2010/10/03(日) 16:48:58 ID:???
>>428
> >>423-424
>
> > このカラムに何も指定をしないでINSERTをかけると、空文字が入ります。
>
> 空文字とNULLの違いをご存知だと言う前提でレスします。
>

おれもかよw
432NAME IS NULL:2010/10/03(日) 17:19:33 ID:???
>>427
列制約としては指定できたんじゃなかった?
バージョンやストレージエンジンによって違うのかも知れんけど。
433NAME IS NULL:2010/10/03(日) 17:50:41 ID:???
指定できて、コマンド通るけど、制約違反を華麗にスルー
434NAME IS NULL:2010/10/04(月) 14:32:37 ID:???
MySQLにおいてDB接続時間の設定を行うにはどうすれば良いでしょうか?

具体的には、PHPスクリプト内でDB接続を行った後に
close漏れがあったとします。

この場合に、DB切断コードの実装漏れがあったとしても
連続で5分以上DB接続状態が残っている場合には、
自動で切断する様にしたいです。

可能であればGUI(phpMyAdmin)上で設定出来るのならしたいです。

※現在は、サクラインターネットの共有サーバを想定しています。
435NAME IS NULL:2010/10/04(月) 15:27:19 ID:???
interactive_timeoutっていうパラメータで設定できるけど、
共有レンタルサーバでは無理なのではないか
436NAME IS NULL:2010/10/04(月) 18:17:23 ID:RNbuW/Kd
interactive_timeout
wait_timeout

現在の、この2つの値を教えてください。
437NAME IS NULL:2010/10/04(月) 18:19:26 ID:???
>>436
さくらのレンタルサーバなので分りません。
438NAME IS NULL:2010/10/04(月) 18:53:12 ID:???
phpMyAdmin動くんならわかるだろ
439NAME IS NULL:2010/10/04(月) 18:56:00 ID:???
>>438
どうやってみれば良いのでしょうか?
440NAME IS NULL:2010/10/04(月) 18:59:57 ID:???
PHPか。
色々MySQLに繋ぐのはあるだろうけど、少なくとも基本のmysql_connectあたりだと、
別に俺やあんたが書いてるPHPのコードでわざわざcloseしなくてもいいんだけどな。
441NAME IS NULL:2010/10/04(月) 19:16:09 ID:???
自称中級者によくある「たぶん原因はコレだろう」だろ
大体は全然間違ってる
442NAME IS NULL:2010/10/05(火) 08:05:06 ID:???
MySQLで再帰SQL相当の処理ってどうやって実現してますか?
ストアドに頼るしかないのでしょうか。
443NAME IS NULL:2010/10/05(火) 08:24:58 ID:???
connect byで、ツリー型の再帰
withで、再帰呼び出しができる
444NAME IS NULL:2010/10/05(火) 08:45:03 ID:???
あ、ごめ MySQLのスレだった >>443間違い
445NAME IS NULL:2010/10/05(火) 15:28:42 ID:???
MySQLでは、uniqueにした場合、大文字小文字の違いはどうなりますか?
446NAME IS NULL:2010/10/05(火) 15:29:47 ID:???
ぐぐれかす
447NAME IS NULL:2010/10/05(火) 19:47:23 ID:???
selectがおかしいです。
select * from hoge where a = 'あ';

とすると、
|"あ" |"hoge" | null |
|"あ" |"hohi" | null |
...

って感じで出力されるはずなんですが、
 | |"hoge" | null |
 | |"hohi" | null |
...

って感じで"あ"のとこが押しつぶされて出力されてしまいます。
何がどうなってるんでしょうか...?
448NAME IS NULL:2010/10/05(火) 19:52:19 ID:???
MySQL 文字化け

でググってみてください。
449447:2010/10/05(火) 19:55:33 ID:???
>>448
load data infileで読み込んでるんですが、
文字コードはsjisでそのとおりにしてるつもりなんですが…
450447:2010/10/05(火) 20:01:35 ID:qhtr8KRl
そのとうりですね。させん
451NAME IS NULL:2010/10/06(水) 09:01:06 ID:???
その「とおり」
452447:2010/10/06(水) 09:13:23 ID:KYR4QbWd
というか「あ」で、"は無かったです。
けど押しつぶされるのはよく分かりません…
453NAME IS NULL:2010/10/06(水) 09:33:34 ID:???
で、ググった結果、どんな風に調べて、文字コードは問題なしと判断したのか聞きたいところ。
454447:2010/10/06(水) 22:58:58 ID:KYR4QbWd
文字化けというか、
出力しながら消えていってる?みたいな感じなんです…
|あ |hoge | NULL |

と出力されてるのに、
次の行を表示する瞬間(?)に、
 ||hoge |NULL|
|あ | hogi| NULL|

みたいにさっき確かに表示されてた「|あ |hoge」のとこが
圧し潰されます。
455NAME IS NULL:2010/10/07(木) 09:31:38 ID:???
ファイルにリダイレクトしてみりゃいいじゃん
456NAME IS NULL:2010/10/07(木) 11:31:41 ID:???
キャリッジリターンが入ってるんじゃね?
457NAME IS NULL:2010/10/07(木) 11:50:28 ID:???
このコマンド結果は、どう? >>447

set names sjis;
select c,hex(c),charset(c),'あ',hex('あ') from テーブル;

cは、変な出力するカラム名。
1行分だけでいいです。
458NAME IS NULL:2010/10/07(木) 13:06:12 ID:???
なにっ! set names sjisで解決だと・・・
459447:2010/10/07(木) 16:30:14 ID:KrND0SBh
>>457
正しく出力されます。
あ 82A0 sjis あ 82A0
です。

複数行にしても正しく出力されるんですが、
なんかselect * from tableだと
変な出力になります。
460447:2010/10/07(木) 16:33:21 ID:KrND0SBh
ファイルへ出力も問題ないです。
なんか表示するときだけ変に…
461NAME IS NULL:2010/10/07(木) 16:59:18 ID:???
>>459
ということは、文字化け つーことで決着ですな
変な出力するところを先のhexで見てみないとわからないね。
462NAME IS NULL:2010/10/07(木) 17:27:45 ID:???
出力されたファイルの文字コードは?
463447:2010/10/07(木) 20:24:13 ID:KrND0SBh
>>462
sjisです。
464447:2010/10/07(木) 20:28:38 ID:KrND0SBh
NULLのあとに、すぐカーソルが元の位置に戻って、スペース、|、ってなった後に
改行してるってこと?みたいですが….
キャリッジリターンってのはどっから入ってきてるのか
465NAME IS NULL:2010/10/07(木) 20:38:41 ID:???
>>464
プログラムで、¥n置換してないかぃ?
そこで¥rも置換すればよいんじゃないかな。
466447:2010/10/08(金) 03:42:06 ID:FtAvuyFN
>>465
正規表現で\nを含めて変換したことはあります。
けど、バイナリエディタで見ても0D0Aの改行が
あるだけなんですが…
467NAME IS NULL:2010/10/11(月) 22:49:37 ID:???
______  ___________
         V
    _____
   /::::::::::::::::::::::::::\                  _
  /::::::::::::::::::::::::::::::::::::::\             /  ̄   ̄ \
  |:::::::::::::::::|_|_|_|_|           /、          ヽ はぁ?黙ってろデブw
  |;;;;;;;;;;ノ   \,, ,,/ ヽ          |・ |―-、       |
  |::( 6  ー─◎─◎ )          q -´ 二 ヽ      |
  |ノ  (∵∴ ( o o)∴)          ノ_ ー  |     |
/|   <  ∵   3 ∵>          \. ̄`  |      /
::::::\  ヽ        ノ\           O===== |
:::::::::::::\_____ノ:::::::::::\        /          |
468NAME IS NULL:2010/10/12(火) 01:04:18 ID:???
すみません、教えてください。

select column1, column2 from table;

という結果に、任意のcolumn1, column2を先頭に予め追加して
おきたいのですが、方法はありますでしょうか。
もしありましたらご教示いただけますと助かります。

よろしくお願いします。
469468:2010/10/12(火) 01:09:20 ID:???
なんだか説明が下手ですみません。

上記は、固定文字列を予め先頭に入れておきたいということです。

よろしくお願いいたします。
470468:2010/10/12(火) 02:31:43 ID:???
unionで自己解決しました。
すれ汚しすみませんでした。
471NAME IS NULL:2010/10/12(火) 09:38:59 ID:???
説明に自信がないときは、簡単な例を示せばいいと思うよ。
472NAME IS NULL:2010/10/12(火) 13:29:49 ID:???
ちょっと教えて下さい。
とある下請けが使う簡単なシステムを作ってるのですが、
以下のようなテーブル(いくつか省略)で作っています。

部品テーブル
・部品ID
・部品名

受注テーブル
・部品ID
・受注日
・受注数
・売価
・納品場所
473NAME IS NULL:2010/10/12(火) 13:37:34 ID:???
うんうん
474472:2010/10/12(火) 14:00:23 ID:???
入庫テーブル
・部品ID
・入庫日
・入庫数

下請けが使うので、顧客はうちしかいないので、顧客情報のテーブルは有りません。
うちのどの部署に納品するかを示すフィールドが受注テーブルに有るだけです。

本題に入りますが、同じ部品IDで売価が違う発注をする場合があるとします。
今は集計するときに、SQL文を多数発行しています。

■Query1
SELECT 部品テーブル.部品ID, 部品名, 売価, SUM( 受注数 ) AS 合計受注数, ( 売価 * SUM( 受注数 ) ) AS 総売上額
FROM 受注テーブル
INNER JOIN 部品テーブル ON 部品テーブル.部品ID = 受注テーブル.部品ID
WHERE 受注日 LIKE  '2010-09-__'
AND o_status =  '1'
GROUP BY , 売価
ORDER BY "
475472:2010/10/12(火) 14:01:11 ID:???
すみません、最後の行の ORDER BY " は消去し忘れました。
476NAME IS NULL:2010/10/12(火) 14:01:55 ID:???
■Query1
SELECT 部品テーブル.部品ID, 部品名, 売価, SUM( 受注数 ) AS 合計受注数, ( 売価 * SUM( 受注数 ) ) AS 総売上額
FROM 受注テーブル
INNER JOIN 部品テーブル ON 部品テーブル.部品ID = 受注テーブル.部品ID
WHERE 受注日 LIKE  '2010-09-__'
GROUP BY , 売価
477NAME IS NULL:2010/10/12(火) 14:15:18 ID:???
Query1で返ってきた受注IDの数だけ、Query2を実行

■Query2
SELECT (
先月以前の入庫 - 先月以前の受注
) AS 開始在庫, 今月の入庫, (
今月までの入庫 - 今月までの受注
) AS 繰越在庫
FROM (
SELECT SUM( 受注数 ) AS 先月以前の受注
FROM 受注テーブル
WHERE 部品ID =  '部品ID'
AND 受注日 <=  '2010-08-31'
) AS q1, (
SELECT SUM( 入庫数 ) AS 先月以前の入庫
FROM 入庫テーブル
WHERE 部品ID =  '部品ID'
AND 仕入日 <=  '2010-08-31'
) AS q2, (
SELECT SUM( 入庫数 ) AS 今月の入庫
FROM 入庫テーブル
WHERE 部品ID =  '部品ID'
AND 仕入日 LIKE  '2010-09-__'
) AS q3, (
SELECT SUM( 受注数 ) AS 今月までの受注
FROM 受注テーブル
WHERE 部品ID =  '部品ID'
AND 受注日 <=  '2010-09-30'
) AS q4, (
SELECT SUM( 入庫数 ) AS 今月までの入庫
FROM 入庫テーブル
WHERE 部品ID =  '部品ID'
AND 仕入日 <=  '2010-09-30'
) AS q5"
478NAME IS NULL:2010/10/12(火) 14:21:03 ID:???
Query1とQuery2を実行して、

部品名 | 開始在庫 | 今月の入庫 | 合計受注数 | 売価 | 総売上高 | 繰越在庫

を求めています。
今結合について勉強していて、1つのSQL文で全てのデータを呼べそうな気がしているのですが、
複雑すぎて泣きそうです。

教えてほしい事
・外部結合を使って、1つのSQL文で全て呼び出せますか?
・できるようでしたら、そのSQL文を教えて下さい。

ヒントだけでも頂けるとありがたいです。お願いします。
479NAME IS NULL:2010/10/12(火) 14:49:36 ID:???
最初のSQLは、合計受注数とかいらんしょ。よって部品テーブルもjoinもgroup byもいらn

idだけselectしたものをq5の後にくっつけて、結合
(distinct id にしたほうがいいかも)

で、そのFrom句にくっつけたid算出テーブル(q6)をq1〜q5の

WHERE 部品ID = '部品ID'
の部分を
WHERE 部品ID = q6.id

select句も

SELECT (
q6.id,
先月以前の入庫 - 先月以前の受注
) AS 開始在庫, 今月の入庫, (
今月までの入庫 - 今月までの受注
) AS 繰越在庫
480472:2010/10/12(火) 15:25:19 ID:???
複数の受注がある中で、受注日は無視して売価ごとにまとめているのでGROUP BYでまとめています。
部品IDとは別に部品名を呼んでくる必要があるのでJOINしています。

一つのSQL文にすることは無理なのでしょうか…。
481NAME IS NULL:2010/10/12(火) 15:38:47 ID:???
いあ・・・
Query1の意義は、あなたの業務に意義はあるのでしょうが・・・
今回、Query1の結果をQuery2にて、使用するという要件に関しては、idしか要らんと言ってます・・・

>一つのSQL文にすることは無理なのでしょうか・・・
俺が伝えたことを試してみたのでしょうか・・・
482472:2010/10/12(火) 16:15:19 ID:???
すみません、今やっています。

MySQLのメッセージ:
#1054 - Unknown column 'q6.i_id' in 'where clause'

と言ってきています。
483NAME IS NULL:2010/10/12(火) 16:40:54 ID:???
結合条件は、外に出さないといかんね。
484472:2010/10/12(火) 17:17:27 ID:???
ん…。

>>479
> idだけselectしたものをq5の後にくっつけて、結合

上記の結合というのがよく分かりません。
JOINは外してIDだけSELECTする文をq6として後ろにくっつけました。
外部とはどういう意味ですか?
485NAME IS NULL:2010/10/12(火) 17:57:51 ID:AHwRH/dq
MySQLのMYDファイルってどういう形式で保存されて読み込まれてるの?

MYDファイルが数百MBでもSELECTがすぐ帰ってくるのはどうやって実装されてるんだろう
486NAME IS NULL:2010/10/12(火) 18:54:19 ID:???
>>484
あ、だめか。
んじゃ、これだ。

FROM句で、
(select distinct 部品ID from 受注テーブル) AS IDS

現在FROM句で結合しているq1〜q5をselect句に移動

〜現状〜
SELECT (
先月以前の入庫 - 先月以前の受注
) AS 開始在庫

これを↓のように

(SELECT SUM( 受注数 ) AS 先月以前の受注
FROM 受注テーブル
WHERE 部品ID = IDS.ID
AND 受注日 <= '2010-08-31')
-
(SELECT SUM( 入庫数 ) AS 先月以前の入庫
FROM 入庫テーブル
WHERE 部品ID = IDS.ID
AND 仕入日 <= '2010-08-31') as 開始在庫

他も同様に変更
487NAME IS NULL:2010/10/12(火) 19:08:18 ID:???
>>486
あ、分かっていると思うけど、

FROM句で、
(select distinct 部品ID from 受注テーブル) AS IDS

これは、
(SELECT 部品ID FROM 受注テーブル WHERE 受注日 LIKE '2010-09-__') AS IDS

っていう意味。
例としてはどっちでも同じ、つーことで。
488472:2010/10/12(火) 20:08:30 ID:???
>>486-487
SELECT句の中にサブクエリを作るんですね、こんなの初めて知りました。
やってみますと、それっぽい答えが返ってきました。感動です。
正しく呼び出せているかチェックしてみます。
489NAME IS NULL:2010/10/12(火) 20:20:45 ID:???
>>485
MYIファイルが頑張っているんだぜ
490472:2010/10/14(木) 09:51:00 ID:???
欲しいデータが正しく呼び出されている確認が取れました。
本当にありがとうございました。
491447:2010/10/14(木) 15:38:17 ID:???
ttp://techbank.jp/Community/blogs/mymio/archive/2008/11/05/3039.aspx
に書いてあるやりかたでやって、mysqlをcで利用することは出来たのですが、
クエリに日本語がはいってるとうまくいきません。
VisualC++ExpressEdition2010です。
どうすればいいでしょうか
492NAME IS NULL:2010/10/14(木) 17:14:09 ID:???
>>491
そんなサンプルで大丈夫か?
mysql_real_connect()の前にmysql_options()で
キャラクタセットを指定する(MYSQL_SET_CHARSET_NAME)。
http://dev.mysql.com/doc/refman/5.1/ja/mysql-options.html
493NAME IS NULL:2010/10/14(木) 17:19:45 ID:???
最近「そんな***で大丈夫か?」ってのが流行ってるらしいね
494NAME IS NULL:2010/10/14(木) 17:42:28 ID:???
447って何でも2chで解決していそうだな。
そんな貴方で大丈夫か?
495447:2010/10/14(木) 22:20:45 ID:???
load dataのときにload data local にするだけでした
496NAME IS NULL:2010/10/15(金) 01:39:28 ID:???
質問!○月以前を呼び出す時は、必ず日付まで指定しないといかんの?

SELECT *
FROM table
WHERE date <= '2010-10-31'

今はプログラムで最終日を求めよるんやけど、
日付を省略する方法があったら教えてー。
497NAME IS NULL:2010/10/15(金) 03:06:06 ID:???
>>496
SUBDATE('2010-11-01', INTERVAL 1 DAY) じゃあかんの?
498NAME IS NULL:2010/10/15(金) 03:14:31 ID:???
なんだLAST_DAYってのがあるやん
マニュアル読む癖を付けようね
499NAME IS NULL:2010/10/15(金) 10:11:42 ID:???
MySQLのシステム要件の記述が見つからない。
Oracleは見つかるんだけどね。
Linuxで使う場合のSwap、/tmpの必要容量について知りたい。
どっかにないかなあ。
500NAME IS NULL:2010/10/15(金) 10:37:21 ID:???
>>498
おお、ありがとー!つまりこういうことやな!

SELECT *
FROM table
WHERE date <= LAST_DAY('2010-10-01')

どの月でも01日入れておけば、プログラムであらかじめ計算せんでもええんやな!
501NAME IS NULL:2010/10/15(金) 12:28:39 ID:???
>>499
とりあえずOracleと同容量確保しといたら足りるよ
502NAME IS NULL:2010/10/15(金) 12:57:58 ID:???
まあ、そりゃそうだろうねw。
503NAME IS NULL:2010/10/15(金) 14:08:25 ID:???
Oracleってインストールめんどくせーってイメージしか無いわ。
OSのカーネルパラメータも弄ったりした覚えがある。
504NAME IS NULL:2010/10/15(金) 20:59:23 ID:???
mysqladmin pingでエラーがでる
csvファイルも取り出せない。どうやればいいのですか?
505NAME IS NULL:2010/10/15(金) 22:16:45 ID:???
 ∧_∧
(´・ω・) 知らんがな
ノ^ y丶
ヽ_ノ==|ノ
 / ||
"""~""""""~"""~"""~"
506NAME IS NULL:2010/10/15(金) 23:56:05 ID:???
コマンドプロンプトで

'>

がつづいて
SQL文が打てない症状ってどうすればなおるんだっけ?
507NAME IS NULL:2010/10/16(土) 08:43:12 ID:lodDPI8n
再起動してください。
508NAME IS NULL:2010/10/16(土) 08:50:28 ID:???
>>506
'> ならシングルクォートをもう一発打てばいいし
">ならダブルクォート
で、\cで抜ける
509NAME IS NULL:2010/10/16(土) 13:28:55 ID:???
>>508
サンクス
すごい困ってた
510NAME IS NULL:2010/10/17(日) 15:21:59 ID:???
フィールドの照合順序(collation)を一括して変更するにはどうすれば?
511NAME IS NULL:2010/10/17(日) 15:29:05 ID:???
MySQLってストアドとかあるの?

また、OracleとかならSQL Developerを使用してストアドをデバッグ実行とかする事が

出切るんだけどMySQLにそういったデバッグ可能なIDEとかってありますか?
512NAME IS NULL:2010/10/17(日) 19:28:17 ID:???
>>511
MySQLはバージョン5からストアドプロシージャをサポート
513NAME IS NULL:2010/10/17(日) 19:46:51 ID:???
>>512
デバッグ出切るIDEとかってありますか?
514NAME IS NULL:2010/10/17(日) 20:28:59 ID:???
むりむり
515NAME IS NULL:2010/10/17(日) 20:30:05 ID:???
そーいうIDEを作ったら売れるかな?
516NAME IS NULL:2010/10/18(月) 09:46:46 ID:???
あんまり売れないんじゃないかなあ
517NAME IS NULL:2010/10/18(月) 12:00:24 ID:???
DBをインポートしたら、collationがlatin1_swedish_ciに設定されてしまうんだが、
一括してutf8_general_ciに変更する方法って無いかな?
518NAME IS NULL:2010/10/18(月) 12:18:04 ID:???
2chで質問するしか能の無い奴には無理 >>517
519NAME IS NULL:2010/10/18(月) 12:57:38 ID:???
>>518
で、おまえにゃできるの? できるかできないかだけでいいからレスしてくれ。
やり方は別にいい。自分で調べる。
520NAME IS NULL:2010/10/18(月) 13:03:21 ID:???
www
521NAME IS NULL:2010/10/18(月) 13:06:02 ID:???
>>519
俺は出切る。お前のおつむじゃ無理だがなwww
522NAME IS NULL:2010/10/18(月) 13:07:20 ID:???
できないわけないよねー
523NAME IS NULL:2010/10/18(月) 19:05:44 ID:???
環境系?の質問って答えづらい。

自環境の状況、書かないやつは、もちろん
事細かに書くやつも、逆になんでそれで直らんの?と思うし。
チェック漏れとか、こっちにはわからんしなぁ

がんばって自分で解決するしかないよ。
524NAME IS NULL:2010/10/19(火) 22:31:29 ID:ZErapWl9
InnoDBの主キーって、クラスタインデックスで、リーフブロックにテーブルのレコードをすべて持つって聞きました。
ということは、主キーのサイズはテーブルのサイズより大きくなるんでしょうか。
525NAME IS NULL:2010/10/19(火) 22:45:20 ID:???
これだろ。
http://thinkit.co.jp/cert/article/0608/1/2/3.htm
それがテーブルそのものなわけだ。
526akiyan:2010/10/20(水) 00:42:34 ID:???
まったく...驚いちゃうよな
未だに「MySQLはおもちゃ」なんて戯言を恥ずかしげもなく口にしちゃう脂ぎったオヤジどもがこの世に数多存在するってんだから

世に存在する全てのデータはMySQLをもって管理される
世に生まれる全ての創造物はMySQLに収納される
これが何を意味するかわかるかい?

これから生まれる全てのものがMySQLそのものだってことだよ

まあ確かに禅問答だって言われれば否定はできないな
でも考えてみなよ君の名前はどこにある?どこかのサーバーのどこかのディレクトリにインストールされたMySQLの中だろう
MySQLに名前が存在しない人間など存在しない 生後間もない赤ん坊は別として

名前がMySQLにあるってことはだ...うんそうそう、そうなんだ、聡明な君ならもう分かったと思う
名前があればそこに君が「在る」んだよ
君の存在はそこに「在る」んだ
だからそれはつまりこういうことだ

------ペニーオークションは詐欺じゃない
527NAME IS NULL:2010/10/20(水) 01:20:46 ID:???
mysql開発のお勧めツール教えて欲しい
528NAME IS NULL:2010/10/20(水) 01:34:12 ID:???
開発ツール?
MyPenniesQL
ペニーオークションで落札しろ
529NAME IS NULL:2010/10/20(水) 06:54:13 ID:???
なんだこいつ
530NAME IS NULL:2010/10/20(水) 12:36:13 ID:???
超初歩的な事を聞いて申し訳ないんですが、最近レコード数が多くなってきて検索が遅くなってきており
インデックスを利用したら早くなるというのを知りました。
しかし、いくつかの例を見てもインデックスはテーブルを作成する段階で作るのが普通のようで、自分のケースの様に
だいぶレコードが増えてしまってから、インデックスを導入するという事は難しいのでしょうか?
531NAME IS NULL:2010/10/20(水) 12:39:54 ID:???
>インデックスを利用したら早くなるというのを知りました。
どんだけ馬鹿なんだよ
532NAME IS NULL:2010/10/20(水) 13:00:26 ID:???
僕もそう教わりましたよ
533NAME IS NULL:2010/10/20(水) 13:27:55 ID:???
禁書目録のことでしょうか?
534NAME IS NULL:2010/10/20(水) 13:32:32 ID:???
インデペンデンス
535NAME IS NULL:2010/10/20(水) 19:51:35 ID:???
>>530
>だいぶレコードが増えてしまってから、インデックスを導入するという事は難しいのでしょうか?

MySQLに対して「インデックス作れ」というコマンドを与えるのは簡単。
やり方はcreate index なり alter table なりでぐぐればよろし。

しかし、何をインデックスにするか適切なカラムを選べるかどうかとか、
そういうこと考えてなかったとすれば、もしかしたら適切なカラムが無い
ようなテーブルだったりの可能性も皆無じゃないし、その点が大丈夫
でもレコード数がちょー多かったら、インデックス作成にはけっこう
時間かかったり。

とかで、簡単な作業とは言い切れない。
でもあっさり済んだりして。
536NAME IS NULL:2010/10/20(水) 21:41:07 ID:kndrTlqd
>>525
ありがとうございます。
なるほど、テーブルと主キーのインデックスが一体化しているんですね。
537NAME IS NULL:2010/10/20(水) 22:28:59 ID:???
InnoDBのテーブルに対して、LOAD DATA LOCAL INFILEで大量のデータをロードする場合、
下記の1.と2.では、一般的に2.のほうが作業時間が短くてすむのでしょうか。

1.既存のテーブルに対してそのままロードする。
2.一旦既存テーブルのセカンダリインデックスを削除して、ロードして、セカンダリインデックスを再作成する。
538NAME IS NULL:2010/10/20(水) 23:15:00 ID:???
>>537
MySQL 5.1までなら1の方が速い。
MySQL 5.1+InnoDB Plugin、MySQL 5.5なら2の方が速い、かも。
実際にやってみよう
539NAME IS NULL:2010/10/20(水) 23:22:36 ID:???
なんで「セカンダリ」インデックス限定?

とりあえず、loadするデータがユニーク制約や外部制約に触れないものと判っていたら、
既存テーブルそのままよりはload前にそれらの制約外しておいた方がいいよ。
540NAME IS NULL:2010/10/21(木) 01:40:39 ID:???
where句にanyを使って副問い合わせしているのですが、
処理に非常に時間がかかってしまっています。
何かいい対策はありますでしょうか
インデックスなどMySQLのメンテの問題でしょうか

sqlを簡略的に書くと以下のようなものなのですが

select CODE,NAME from TBL1 where aaa = 'AA' and CODE = any (select CODE from TBL2 where bbb = 'BB' and ccc = 'CC' group by CODE)

TBL1は約2,500件
TBL2は約390,000件

わかりにくいかもしれませんが
よろしくお願いします。
541NAME IS NULL:2010/10/21(木) 03:21:03 ID:???
>>540
MySQLでそういうサブクエリを書くと
(select CODE from TBL2 where bbb = 'BB' and ccc = 'CC' group by CODE)
の部分が最悪2,500回実行される。2,500回とも内容は同じにも関わらず。

SELECT DISTINCT TBL1.CODE, TBL1.NAME FROM TBL1, TBL2
WHERE TBL1.CODE = TBL2.CODE
AND TBL1.aaa = 'AA'
AND TBL2.bbb = 'BB'
AND TBL2.ccc = 'CC'

CREATE INDEX TBL1_IX1 ON TBL1 (aaa, CODE);
CREATE INDEX TBL2_IX1 ON TBL2 (CODE, bbb, ccc);

でどうか。
542540:2010/10/21(木) 09:49:57 ID:???
> 541
早々に有難う御座います
今夜帰ったら試したいと思います
またカキコします
543NAME IS NULL:2010/10/21(木) 22:21:24 ID:???
ご意見聞かせて頂きたいのですが、
大カテゴリ、中カテゴリ、商品

以上のテーブルがあった場合、
商品テーブルに、大カテゴリと中カテゴリのリレーションを持たせるべきでしょうか?

大カテゴリに含まれる中カテゴリ内の商品を全て取得したい要件があります。

それとも、商品テーブルには、中カテゴリのリレーションのみを持たせ、
大カテゴリ、中カテゴリ、商品と連なったリレーションを利用すべきでしょうか?
544NAME IS NULL:2010/10/21(木) 22:43:12 ID:???
商品テーブルにはカテゴリ持たせずに、
陳列テーブルに大・中・商品を入れる。
ホーム・キッチン用品でも、アウトドア用品に含まれるモノもあるだろうし。
545NAME IS NULL:2010/10/22(金) 11:08:33 ID:???
MySQLテーブル上に VARCHAR(100) と定義している項目に

あいうえお  ・・・ 10バイト

と登録した場合、90バイト分は常に確保されてしまっているのでしょうか?
oracleとかなら大目に定義したとしても自然に使用されていない部分は
端折られたと思うのですが如何でしょうか?
546NAME IS NULL:2010/10/22(金) 12:43:23 ID:???
>>545
あまり詳しくないけど、
varcharは可変長だから端折られる。内容量+アルファ程度だったかな。
固定長なcharなら確保されてるかと。
ちなみに、mysql5.0からだったか、varchar(100)は100バイトじゃなく100文字になった。
547NAME IS NULL:2010/10/22(金) 13:56:44 ID:a2nHdPCr
すっごい初歩的な質問なんですが
小数点第3位四捨五入できる(5/3の計算で1.67を出力する)
関数ってありませんか?
(PHPで言えばnumber_formatです。がPHPは使用できません)
第3位切り捨てでもOKです。
548NAME IS NULL:2010/10/22(金) 14:41:49 ID:???
マニュアル読んでから質問しようぜ
549NAME IS NULL:2010/10/22(金) 19:36:22 ID:???
>>546
ありがとうございます。

無駄に容量を食っていたんじゃないかと
あせってました。
550NAME IS NULL:2010/10/22(金) 21:27:45 ID:???
>> 538 >>539
ありがとうございます。

> なんで「セカンダリ」インデックス限定?
主キーは残してそれ以外は削除する、という意図でした。
主キーまで削除してしまうと、暗黙の主キーが設定されるらしいので、
それを避けたいと思いました。
551NAME IS NULL:2010/10/22(金) 23:10:43 ID:???
>>543>>544
データの関係性を説明せずにテーブルの設計を質問する質問者に、
それを確認せずに勝手な想定で回答する回答者。
DB板のよくある光景。
552NAME IS NULL:2010/10/24(日) 17:58:03 ID:???
質問失礼します。
現在OSWIN7にMySQLをダウンロードしてインストールする際に
InnoDB Tablespace Settingsという項目が空白になってしまい、選択ができません。
何かファイルを消してしまったようです。これを復活させる方法はないでしょうか?
553NAME IS NULL:2010/10/24(日) 18:02:54 ID:???
ヒント句ってどういう用途で使うのですか?
またMySQL(5.0)ではどのように使うのですか?
554NAME IS NULL:2010/10/24(日) 19:08:41 ID:???
オプティマイザが決定した実行計画が意図通りでなく期待通りのパフォーマンスが
出なかった時に、特定のアクセス方法を強制する場合などに使う。
今はそういうものがあるとだけ覚えておけばよい。必要になる頃には調べ方もわかってるはず。
555NAME IS NULL:2010/10/26(火) 01:08:28 ID:???
MySQL5.0(UTF-8)を使ってますが
「〜」、「@」、「U」、「p」、「−」などなどなどなど
環境依存文字を含む多くの文字・記号を含むデータのinsertがはじかれてしまうのですが。

webのform上からpostしたら大丈夫だったので
何かinsertの方法に不備があったのかなと思っています。

情報足らずかもしれませんが何かわかるかたいらっしゃいますでしょうか。
556NAME IS NULL:2010/10/26(火) 19:48:54 ID:???
Windowsのコマンドプロンプトからinsertしようとしてるのかと
予想するくらいしかできんね。
557NAME IS NULL:2010/10/27(水) 13:50:48 ID:krhumVm4
SQL質問
同じテーブルのレコード1のカラム1をレコード2のカラム1にコピーしたい
update table1 set column1 = (select column1 from table1 where id=1) where id=2;
だと
ERROR 1093 (HY000): You can't specify target table 'xxxx' for update in FROM clause
怒られる
おねがい教えて><
558NAME IS NULL:2010/10/27(水) 14:34:31 ID:???
559NAME IS NULL:2010/10/27(水) 15:01:44 ID:krhumVm4
>>558
さんきゅう。一日なやんでしまった
560NAME IS NULL:2010/10/27(水) 18:25:08 ID:???
text型のフィールドから正規表現に一致するデータのみを取り出したいのですがどうすれば可能でしょうか?
例)
http://example.com/**(**はフィールドによってまちまち)

下記でtextを全部取り出してperl,phpなどのプログラムで該当するURLを取得するくらいしか思いつきません。
select text from hoge where text like '%http://example.com/%';

変な質問で申し訳ないのですが、ご教示お願い致します。
561NAME IS NULL:2010/10/27(水) 21:22:45 ID:???
562NAME IS NULL:2010/10/27(水) 22:23:37 ID:???
URLが必要ならテーブル設計が悪いんじゃね?
アクセス頻度にもよるけど、テーブル格納時にバラしておくものかと
563NAME IS NULL:2010/10/28(木) 09:27:27 ID:WiuIWGIq
SQL文のコーディング規約みたいのはありますか?

CREATE TABLE HOGE (
 ID INT AUTO_INCREMENT PRIMARY KEY,
 FOO VARCHAR NOT NULL
);

この時テーブル名HOGEは小文字で書くべきとか
カラム名のID FOOを小文字で書くべきとか
大文字小文字を区別しないのはわかるのですが
コードを書くときどうするべきでしょうか?
564NAME IS NULL:2010/10/28(木) 12:01:09 ID:???
自由にすればいい。
昔はSQLはすべて大文字で書くのが普通だったが。
565NAME IS NULL:2010/10/28(木) 13:27:09 ID:???
>>561
ありがとうございます。
URLを含むカラムを取り出すこと自体は既にできています。
ただできたらURLだけを取り出したいと思ってましたがどうも無理っぽい(不可能ではないですが、プログラムまわしたほうがよさそう)ですね;;


>>562
設計というより、サービス終了するサイトの画像URLがフィールドで使われているので使われている画像のみ新しい画像サイトに移そうと考えてます。
かなり特殊な事例だとは思います;;
566NAME IS NULL:2010/10/28(木) 22:39:48 ID:???
某オンラインゲームのサーバ別情報サイトを扱いたいのですがサーバが5つあります
サーバ別にテーブルを用意すべきか
カラムにサーバ名を入れることでテーブルを統一するかで悩んでます
アプリケーションの実装的には後者のほうが楽なのですが
のちのちレコード数が増えることを考えると速度面で前者にしといたほうがいいのでしょうか?
合計して1日10000件のデータの追加もしくは更新を見込んでいます
放置しておくとデータが増える一方で検索速度にも影響が出ると思うのですが
定期的に古いデータを削除もしくはデータとして蓄積だけ行う墓場のような場所に移動すべきでしょうか?
データを残して削除フラグだけ立てる方法もありますが
レコード数が変わらないので速度的にはどうなのでしょう?
567NAME IS NULL:2010/10/28(木) 23:47:09 ID:???
カラムにサーバ識別子入れるのが教科書通りの設計
個人サイトなら遅くなったらその時点で設計見直せばいいと思う
568NAME IS NULL:2010/10/28(木) 23:51:52 ID:???
そんな場当たり対応をしたくないから最初の設計で悩んでるんだと思うけど
569NAME IS NULL:2010/10/29(金) 00:00:52 ID:???
分割したってせいぜい5分の1にしかならないんだから意味ないよ。
気になるならメモリ5倍積めばいいよ
570566:2010/10/29(金) 00:11:42 ID:???
>>567-569
ありがとうございます
たいして変わらないということでいいんですね?
確かテスト用レコードを何万件も提供してるようなサイトがあったような気がするので
探して本番環境とは違うしアクセス数も考慮しないのであまり参考にはならないですが
一応自分のPCで検証してみたいと思います
571NAME IS NULL:2010/10/29(金) 02:58:50 ID:???
カラムにサーバ名を入れることでテーブルを統一しといて5台のサーバでcluster
処理追いつかなくなったら、サーバ追加

運用当初は削除はフラグにしておく
容量足りなくなるか、削除データが負荷になるようなら
ログ用DBサーバ用意してarchive engineにする

みたいに、場当たり的じゃなくてちゃんとスケールを考慮した設計しとけばいいんじゃないの?
572NAME IS NULL:2010/10/29(金) 05:16:27 ID:???
5.1のパーティションでテーブル内でサーバー毎に分けるとか。
573NAME IS NULL:2010/10/29(金) 13:31:52 ID:???
すごく初歩的な質問だと思うのですが、、、
1億件ぐらい入っているテーブルに、20万件ぐらいのデータを定期的にインポートしているのですが
データを PRIMARY KEY の項目で予めソートしておいたものはロードの時間が短く
ソートしないものは長い、ということに最近気づきました。
ソートされていないと、PRIMARY KEY で作成される INDEX の更新に時間がかかるのでしょうか?
574NAME IS NULL:2010/10/29(金) 23:37:12 ID:HzUTuPtD
warning でも die するようになる方法はないでしょうか?
575NAME IS NULL:2010/10/30(土) 02:10:07 ID:???
>>573
http://h50146.www5.hp.com/products/software/oe/linux/summary/mwtech/
→ MySQL Server 5.0 InnoDBデータベース 大量データ投入方法
に詳しく書いてあるよ
576573:2010/10/30(土) 07:53:31 ID:???
>>575
ありがとうございます。分かりやすい資料でした。
InnoDB ではなく MyISAM ですが、共通する要因があるのでしょうね。
PRIMARY KEY ではなく INDEX KEY のみの場合は、未ソートデータのロードで
それほど処理時間の増大が見られないということは、UNIQUE 制約による処理が
影響しているのでしょうか。
大変参考になりました。
577NAME IS NULL:2010/10/30(土) 10:22:20 ID:???
MySQLで大量データのDB設計するのに
わかりやすい、おすすめの書籍やサイトってありますか?
運用や実際の操作より設計に重点を置いたものがいいです
578NAME IS NULL:2010/10/30(土) 10:40:03 ID:???
結局試行錯誤
579NAME IS NULL:2010/10/30(土) 11:02:42 ID:???
そこをなんとか
580NAME IS NULL:2010/10/30(土) 14:41:16 ID:???
設計っつてもな。
物理設計なら、半分は運用や実際の操作がかかわってくるし。
論理設計なら、MySQLとか限定する必要もないし。
581NAME IS NULL:2010/10/30(土) 17:27:42 ID:???
大量ってどのくらいのデータ?それにも依るんじゃない
数10G、数100G、Tバイト?
あとどんな使いかたするDBなのかも重要じゃね?JOINしまくりなのかテーブルなめまくりなのか
予測しとくと「Tバイトに近いデータをどんな複雑な条件でも超高速に検索したい」とかの無理難題
582NAME IS NULL:2010/10/30(土) 18:54:58 ID:???
データ量って件数じゃなくてDBのサイズに依存するのか?
583NAME IS NULL:2010/10/31(日) 09:21:48 ID:???
松信嘉範氏の本が良さげ。
584NAME IS NULL:2010/10/31(日) 21:55:20 ID:???
http://clown-do.ddo.jp/phpmmmyadmin/index.php

これGoogleに普通に拾われてるけど大丈夫なもんなの?
585NAME IS NULL:2010/10/31(日) 22:43:10 ID:???
>>584 かなり危ないですね。知らせてあげましょう。
586NAME IS NULL:2010/10/31(日) 22:52:14 ID:???
うわあ・・・俺は踏まないけど

でもこういうのアクセスしても不正アクセスになるんじゃないの?
587NAME IS NULL:2010/10/31(日) 22:53:10 ID:???
ユーザーにパスワード設定してないのかな
酷いね
588NAME IS NULL:2010/11/01(月) 01:01:34 ID:???
>>586
踏んだけど、別にこれなら不正アクセスにはならんと思う。
一般公開してるもんだ。
Googleに載ってるってことは、ここへのリンクをどこかに書いておいたわけか。二重の失態だな。
589NAME IS NULL:2010/11/01(月) 03:50:30 ID:???
phpmyadminって、専用のディレクトリを作って、
.htaccessでアクセス制限した上で、更にmyadminの
パスワード設定をして使って、用が済んだらその都度
消せと教わったけど、今は公開が普通なの?
590NAME IS NULL:2010/11/01(月) 09:05:14 ID:???
これって個人サイトでしょ
591NAME IS NULL:2010/11/01(月) 11:02:35 ID:???
もう数年前になるけど、レンサバでも他ユーザのスケルトン丸見えってのがあったぞ。
さすがにDBにはアクセスしなかったが、サバ屋に電話して対策されるまで1週間程かかってたな。
phpで作ってるからなのか、設置する側のセキュリティに甘さが見える時があるよ。
592NAME IS NULL:2010/11/01(月) 17:15:05 ID:ab0tfyDH
select user();と打つと
root@localhost
と表示され、rootユーザしか無い様です。
hogeuserを加えようと
GRANT SELECT,INSERT,UPDATE,DELETE,create,index,alter ON hogedb.* TO hogeuser@"localhost" IDENTIFIED BY "hogehoge";
と打つと
ERROR 1133 (42000): Can't find any matching row in the user table
のエラーが発生しました。
use hogedb;で、データベースに入っても同じです。


この状況でどのようにしたら、ユーザを追加出来ますか?

当方CentOS5
mysql 5.0.77

593NAME IS NULL:2010/11/01(月) 18:48:30 ID:hFBJdldW
全文検索をやってみようかと思い、sennaを調べていたのですが、wikipedia に

「新たな開発は事実上終了しており」

とあったんですが、日本語の全文検索はどういうやり方が現在主流なのでしょうか?

Namazu? 私の情報はちょっと古すぎて・・。
594NAME IS NULL:2010/11/01(月) 19:03:35 ID:???
>>593
現状でいえばまだsenna(tritonn)でいいんじゃない?はてなでも使ってるらしい。
後継はgroonga。でも、まだmysql用のストレージエンジンは開発中で実用には程遠いとのこと。
595NAME IS NULL:2010/11/01(月) 19:05:52 ID:???
>>589
自分はhtaccessでIPアドレス制限で使ってる。
IPアドレス変わったらSSHでhtaccessを書き換えてる。
596NAME IS NULL:2010/11/01(月) 20:19:48 ID:hFBJdldW
>>594
そうなんですね。ありがとうございます。
じゃあ senna(tritonn) を試してみよう。
597NAME IS NULL:2010/11/02(火) 22:12:07 ID:XgzNnL/a
CentOS5 64bit
MySQL 5.1.52

MySQLをソースからインストールした後、
問題なく起動し、phpMyAdminもアクセスできる。
だが、コマンドラインから
mysql -u root -p
とログインしようとすると、パスワードを入力した後に
Segmentation Fault
となる。

configureオプションや、MySQLのバージョン等
いろいろ変えてみたがダメ。
分かる人いない?
598NAME IS NULL:2010/11/02(火) 22:38:42 ID:???
これかなぁ?

http://bugs.mysql.com/bug.php?id=45562

なんか最後の人が、ソースにちょこっと手を入れてmakeし直すって
解決法を示してますね。それが正しいのかどうかは知らんけど。
599NAME IS NULL:2010/11/02(火) 23:41:27 ID:???
VirtualBoxでCentOSインストールして、C + MySQLでプログラム組もうとしてるんですが、
PHP + MySQLならネット上にも書籍でもたくさん資料あるんですけど、CとMySQLだとあんまり情報なくて困ってます
どこを見て勉強するのが良いでしょうか?
600NAME IS NULL:2010/11/02(火) 23:45:27 ID:???
オライリーのMySQL本にCの接続サンプル例が載ってた ちと古いけど
601NAME IS NULL:2010/11/03(水) 07:08:29 ID:???
接続した後はやることは同じだもんな。
mysql(クライアント)のソースでも覗いてみては。
602NAME IS NULL:2010/11/03(水) 17:54:59 ID:???
Oracle kills low-priced MySQL support
http://www.theregister.co.uk/2010/11/03/oracle_mysql_price_hike/

ボラクルのMySQL切り、きたー。
603NAME IS NULL:2010/11/03(水) 18:13:05 ID:ZhMqIH4k
forkへの本格的な移行時代到来!
604NAME IS NULL:2010/11/03(水) 18:20:51 ID:???
移行するならMariaDBかな?
605NAME IS NULL:2010/11/03(水) 19:21:17 ID:???
それ誰か使ってるの?
606NAME IS NULL:2010/11/03(水) 19:27:00 ID:???
名前が厨二すぎる
607NAME IS NULL:2010/11/03(水) 22:17:55 ID:???
切るも何も、おまえらMySQLのサポートなんて使ってないだろ。
608NAME IS NULL:2010/11/03(水) 22:20:32 ID:???
なんでわかった!!!!
609NAME IS NULL:2010/11/04(木) 06:07:29 ID:???
サポート切りって別に開発中止に繋がるようなものでもないじゃん。。。
610NAME IS NULL:2010/11/04(木) 10:22:02 ID:???
木構造のデータをいくつも保存したいのですが
何か方法ないでしょうか?
611NAME IS NULL:2010/11/04(木) 11:09:52 ID:???
XMLはimportする方法あるんですね
612NAME IS NULL:2010/11/04(木) 18:08:13 ID:???
MariaDBってネーミングはヤメてほしいよな
娘がマリアなんだっけ?

本筋のforkかもしれんが、このネーミングはナシだ
613NAME IS NULL:2010/11/04(木) 18:11:59 ID:???
今じゃ普通だがよく考えればMySQLってネーミングも・・・
614NAME IS NULL:2010/11/04(木) 18:21:45 ID:???
Myも娘の名前だからな
娘を金持ちのおっさんに寝取られたようなもんだ
615NAME IS NULL:2010/11/04(木) 18:27:44 ID:???
嫁いだと考えよう
きっと姑にいじめられるんだろうけど
616NAME IS NULL:2010/11/04(木) 18:36:59 ID:???
そうはいっても、ブサイクな娘マリアのお世話になるかもしれんのぜ?
617NAME IS NULL:2010/11/04(木) 19:07:04 ID:???
綺麗な姉ちゃんに育ったマイは嫁に行ったよ
ブサイクでforkなマリアは行くあてが無くてね、父ちゃんと二人暮しさ
618NAME IS NULL:2010/11/04(木) 19:25:41 ID:???
長男は独立したのか?マックスくんは
619NAME IS NULL:2010/11/04(木) 21:44:59 ID:???
質問なんですが、
20kB程度の画像データとそれに伴うせいぜい大きくて20文字程度の
メタデータ10種類くらいをデータベースで管理しようとしたとき
以下の3つのうちどれがいいと思いますか?
データ件数は最大1000万件、メタデータに関してはwhere節や
order byを使って自在に検索したいとします。

A.全部ひとつのテーブル

B.メタデータと画像データを別テーブル

C.メタデータはデータベースで、画像データは画像ファイル
620NAME IS NULL:2010/11/05(金) 11:08:25 ID:???
>>619
俺ならC。きもちいいぞ
621NAME IS NULL:2010/11/05(金) 11:10:52 ID:???
>>620
cはムリポ(´・ω・`)
622NAME IS NULL:2010/11/05(金) 14:28:38 ID:???
>>619
バイナリ突っ込んで文字コード変換なんかでぶっ壊されて以来
俺はバイナリファイルはファイルとして置くようにしているな。
突っ込んだほうが良い事例があったら俺も聞きたい。
623NAME IS NULL:2010/11/05(金) 14:46:44 ID:???
base64エンコしてテキストとして書き込むとか
多少データ膨らむけどね
624619:2010/11/05(金) 15:27:21 ID:JLrTiqr7
回答サンクス
>>620,622
画像ファイルを1000万個扱うことに
問題があるかなと思ってCはちょっと怖いんだけど
大丈夫かな。
ファイルシステムはext3。
625NAME IS NULL:2010/11/05(金) 15:35:10 ID:???
>>624
一箇所に置くのはきつそうだね
俺はルールベースでフォルダわけて置いてる
1フォルダあたりなんとなくなんだけど
2000ファイルくらいになるように調整して

626619:2010/11/05(金) 15:41:26 ID:???
なるほどー
2000ぐらいずつフォルダにわけて
ファイルで管理するのが正解なのかな。
627NAME IS NULL:2010/11/05(金) 17:59:42 ID:???
>>626
20k程度の画像ならDBに突っ込む方があきらかに管理の手間が減る。

628NAME IS NULL:2010/11/05(金) 18:13:53 ID:???
1000万個って結構多いねー
629619:2010/11/05(金) 18:27:58 ID:???
>>627
管理はたしかにDBがラクかもですね。

管理のラクさ  A>B>>>C
信頼性 C>B>A
速さ   C>B>>>A

って感じなのかなあ?
630NAME IS NULL:2010/11/05(金) 19:03:26 ID:???
ファイルにしてもNFSとかに置いちゃうと激遅だから気をつけた方がいいよ
バイナリ破壊は、壊れない方法を一旦確立すれば大丈夫。
その件数だったら俺なら 別テーブルにして file_per_table して更にパーティショニングしちゃうな
631NAME IS NULL:2010/11/05(金) 23:00:52 ID:???
mysqldump について教えてください

db ver5.1.46 OS WinXP

-- MySQL dump 10.13 Distrib 5.1.46, for Win32 (ia32)
で出力された内容を見ると
/*!40101 SET character_set_client = utf8 */;
になっています。

my.iniの
[mysqld]では
default-character-set=cp932
と指定はしてます
show variablesで見ると
character_set_client cp932
character_set_connection cp932
character_set_database cp932
character_set_filesystem binary
character_set_results cp932
character_set_server cp932
character_set_system utf8
となっています。

なんで、mysqldumpではこのような表示になっているんでしょうか?

※dump出力時には
--default-character-set=cp932
の指定も付けています
632NAME IS NULL:2010/11/05(金) 23:20:22 ID:???
よく見れ、クライアント側のキャラセットだろ。
633631:2010/11/05(金) 23:41:33 ID:???
ここらへんが全然判っていないところだと思うのですが、、、、、
要は出力をcp932で出したいのですけどね

character_set_system utf8
だからsystemの方は utf8だと

んでクライアントの方は cp932ですよと

じゃぁ dump出力時の
--default-character-set=cp932
はどういう意味が?
634NAME IS NULL:2010/11/06(土) 08:32:10 ID:???
>>619
サービスの規模によりそうな気がする。
俺ならBを選ぶかなー
他のデータも乗ってくるなら、スキーマごと分けて、
いつでも画像スキーマだけ別箱に移せるようしとくとか。

Cは安定と信頼の実績
Aはもし速度とか問題になってリプレイスするときダルそう。
635619:2010/11/06(土) 11:47:14 ID:???
>>630
NFSの予定でした(汗
データサーバが別サーバのとき
C案を使うとしたらNFS以外どういう選択肢があります?
ftp?scp?samba?
パーティショニング勉強してみます。

>>634
不特定多数に公開するものではないので
サービス規模は大きくないです。

>Aはもし速度とか問題になってリプレイスするときダルそう。

実は今がその時だったりして(^^;
チューニングを最低限しかしてないので、
リプレイスが決定したわけでもないんですが。
636NAME IS NULL:2010/11/06(土) 15:37:31 ID:???
637NAME IS NULL:2010/11/06(土) 18:48:22 ID:???
>>635
元レスの意図がわからんが、NFSでいいんじゃね?
その際、画像データサーバをDBサーバにぶら下げる(DBからのアクセスに限定する)のか、
クライアントから直接アクセスさせるのかは、
パフォーマンスとアクセス権管理のし易さとの見合いで。
638NAME IS NULL:2010/11/06(土) 21:07:39 ID:+K2t6oWr
先ほどmysqlを勉強するためにインストールし、色々触っているところなのですが・・・

おそらく文字コードの関係だと思うのですが検索結果が0件となってしまいます。
対象となるTESTテーブルはno(int 2)、name(char 20)の2カラムで構成されていて、
select文は「SELECT * FROM test WHERE name='abcde';」です。
もちろんこのabcdeという名前を持つレコードは存在していますが、「Empty set (0.00 sec)」と帰ってきます。
しかし、noの方を条件に用いると正常にデータが表示されます。

MySQLのエンコード設定を確認すると、filesystemがbynaryである以外はすべてutf8になっています。
my.iniのデフォルトキャラセットもutf8です。
関係があるかどうかはわかりませんが、テーブルにデータを流し込む際は
csvファイルを作成してutf8形式で保存したものを使いました。
ちなみにこのcsvファイル中に記述したレコードの中には、nameが2バイト文字のものと
半角英字のものとがありますが、2バイト文字の方はコマンドプロンプトからは化けて見えます。

どのようにして対処すれば良いのでしょうか?
よろしくご教示願いますorz
639NAME IS NULL:2010/11/06(土) 22:01:56 ID:???
これは難題だ・・・ゴクリ
640NAME IS NULL:2010/11/06(土) 23:05:20 ID:???
where name like 'abcde%'
ではどうか
641638:2010/11/07(日) 00:06:55 ID:???
遅くなりましたが、自己解決してしまいました。
csvを作成した際に、文字列をダブルクォーテーションでくくったのが問題のようでした。
文字列はくくるものという自分の中での常識が間違っていたようで申し訳ないです。
どうもお騒がせしました・・・
642NAME IS NULL:2010/11/07(日) 00:15:54 ID:???
ちゃんとマニュアル読んで
[[OPTIONALLY] ENCLOSED BY 'char']を覚えてください
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
643619:2010/11/07(日) 00:16:30 ID:???
>>636
勉強にはなったけど、むりぽw
>>637
元レスは一度に大量の画像ファイルを
読むことを言っているのかもしれませんね。
一度に読むのはせいぜい30個くらいだから、
NFSで問題ないかな。

>>638
そのSELECT文はコマンドプロンプトから
打ってるのかな?
自分自身も原因は把握してないが
サーバの環境(インスコ時のコンパイルの仕方?)
によってはコマンドプロンプトでutf-8使えなくね?
phpやらなんやらでutf-8使ったクエリ出す分には
問題ないんだが。
644NAME IS NULL:2010/11/07(日) 18:32:27 ID:???
ver 5.1.41 os XP

テーブル作成時にカラムに付けたコメントってどうやったら削除できるんでしょうか?

645NAME IS NULL:2010/11/07(日) 23:36:02 ID:???
alter table テーブル名 modify column 列名 データ型等 comment '';
646NAME IS NULL:2010/11/07(日) 23:50:25 ID:???
>>645
有難うございます。コメントの削除ができました。
647NAME IS NULL:2010/11/08(月) 12:11:19 ID:Wi0JYnZP
質問させてください。

|id| key|
|1 | 1|
|2 | 1|
|3 | 2|
|4 | 2|
|5 | 2|
|6 | 3|
|7 | 3|
|8 | 3|


のようなテーブルがあるとき、keyカラムの値が重複しているものの中から
一つだけランダムに選んで抽出したいのです。
例えば id が
{1, 3, 7}
{1, 4, 8}
{2, 3, 6}
のような組み合わせを抽出したいのですが、これを最も簡単に書くには
どのようなSQLをかけばよいでしょうか?

ご教示いただけると幸いです。
648NAME IS NULL:2010/11/08(月) 12:50:11 ID:CgV29jGv
初歩的な質問かもしれませんがお願いします。

ユーザがどのDBに対してどんな権限を持っているのか分かるようなコマンドはありますか?
select * from mysql.user;
とやってみたのですが、それらしき項目がなかったので・・・
MySQLのバージョンは5.0です。
649NAME IS NULL:2010/11/08(月) 13:22:55 ID:???
select * from mysql.db;
650NAME IS NULL:2010/11/08(月) 14:31:30 ID:???
ありがとうございました!
651NAME IS NULL:2010/11/09(火) 02:19:15 ID:XUvSW9tK
>>637
同意。
バイナリをDBに格納するなんて基地外。
コネクション長時間握られてあっという間に飽和するぞ。
転送時間を考えるべし。
652NAME IS NULL:2010/11/09(火) 15:41:38 ID:gRZ7qjVv
MySQL5.0のデータをmysqldumpを使って
MySQL5.1にリストアしようとすると以下のエラーが出ます。

ERROR 1064 (42000) at line 171: You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right syntax to use
near 'USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8' at line 45

原因が分かりません。お願いします。
653NAME IS NULL:2010/11/09(火) 16:00:02 ID:???
>>652
mysqldump を実行するとエラーになるの?
それともリストア時にエラー?
654653:2010/11/09(火) 16:02:30 ID:???
ごめん リストアって書いてあったね
リストアはどうやったの?
655NAME IS NULL:2010/11/09(火) 16:34:25 ID:gRZ7qjVv
>>654
リストアは

mysql -u user -p < mysqldumpで作成したファイル

で行っています。
656NAME IS NULL:2010/11/09(火) 16:37:51 ID:gRZ7qjVv
>>652です
受け手と送り手のバージョンが逆でした。
もしかしたらBTREEは5.0では使えないのでしょうか?
そうでしたら回避方法はあるのでしょうか?
657NAME IS NULL:2010/11/09(火) 17:07:46 ID:gRZ7qjVv
>>652です
5.1でmysqldumpされたCREATE文の USING BTREE の
位置では5.0でエラーになることが分かりました。
この回避策はあるのでしょうか?
バージョンを合わせるしかないのでしょうか?
658NAME IS NULL:2010/11/09(火) 17:39:50 ID:???
Bug #25162: Backing up DB from 5.1 adds 'USING BTREE' to KEYs on table creates
ttp://bugs.mysql.com/bug.php?id=25162
ということらしい
バージョンを合わせるか、「mysqldump --compatible=mysql40 ...」という手もあるようだ
659NAME IS NULL:2010/11/09(火) 18:02:49 ID:gRZ7qjVv
>>658
ありがとうございます。
参考にします。
660619:2010/11/09(火) 18:14:37 ID:???
>>651
みなさんありがとうございましたm(_ _)m
素人なんで勉強になりました。
C案で決定でやることにします。
661NAME IS NULL:2010/11/10(水) 21:59:45 ID:???
質問です。
NOW()やUNIX_TIMESTAMP()は、
FOR UPDATE等のロックで待たされた場合、
SELECTを仕掛けた瞬間と、待ちが終わってSELECTが実行できたときと
どちらの時間を返しますか?
662NAME IS NULL:2010/11/10(水) 22:34:49 ID:???
どっちか知りたいなら試してみりゃいい。
ただし、決まっているとは限らんけどな。
663661:2010/11/10(水) 22:42:16 ID:???
>>662
おっしゃるとおり。時間ができたら試してみます。
べ、別に誰か既に試したなら教えてくれてもいいんだからねっ!
664661:2010/11/11(木) 02:14:24 ID:???
試してみた。結果、待ちが終わった時間を取得。

まぁ、ロックされてる情報にしたって最新のを取得してくれるんだから
時間もそうなるよなぁ。
665NAME IS NULL:2010/11/11(木) 06:23:58 ID:???
phpを用いて、 mysqlで構築したDBからデータを取得し、ページ上に表示させようと考えています。
しかし、同じようにDBに接続し、クエリを発行しているのに取得結果が異なります。
対象のデータはchar型の文字列で、一方のページでは「TEST」となるのに対し、もう一方のページでは「"TEST"」となってしまいます。
接続には後述のような記述を用いていますが、SELECT文のみ異なります。
前者はSELECT * FROM test WHERE以下略
後者はSELECT aaa,bbb FROM test WHERE以下略
何故このような違いが出るのでしょうか?自分としてはクォーテーションが含まれない方が好ましいのですが、どうすれば良いでしょうか?
上記に関し、mysqlスレならわかるかもとphpスレより誘導されてきました。
何かわかる方が居られましたらご教示頂ければと思います。
参考までに、phpでDB接続・クエリ発行のソースを記しておきます。


$db = mysql_connect("localhost", "アカウント", "パスワード") or die("接続できませんでした\n");
mysql_query("SET NAMES utf8") or die("SET NAMES utf8 の設定ができません");
mysql_select_db("データベース名", $db) or die("該当するデータベースがないようです\n");
$query = "SELECT カラム FROM テーブル名 WHERE no = '$no'";
$result = mysql_query($query, $db);
$row = mysql_fetch_row($result);
666NAME IS NULL:2010/11/11(木) 16:33:54 ID:???
肝心の出力処理の部分を書きなさい
667665:2010/11/11(木) 22:15:43 ID:???
>666
失礼しました。
両者とも$row[0]や$row[1]です。
前者は
echo $row[0];
後者は
print <<< HTML
<h2>$row[0]</h2>
HTML;
このあたりの違いはありますが・・・
668NAME IS NULL:2010/11/12(金) 07:25:05 ID:???
データベースの容量が大きくなってしまったので、
ローカルで1行ずつ容量の削減をする作業をしています。
容量は700MB、レコード数は約20万です。

$i = file_get_contents('count.php');
$j = 0;
while(1){
$r = db_query('SELECT id,description FROM entry ORDER BY id LIMIT '.$j.',1'); //mysqli関数を使った独自関数です
if($r === FALSE){ die(); }
db_query('INSERT INTO entry SET decription = "'.mb_substr($r[0]['description'],0,200,'UTF-8').'" WHERE id = "'.$r[0]['id'].'"');
$i++;
file_put_contents('count.php',$i);
$j++;
if($j==1000){break;} //ここの数字を変えて1度に処理する量を変える
}
db_query('OPTIMIZE TABLE entry');

テーブルの容量が減れば減るほど、UPDATEやOPTIMIZEは早く終わるのではと思い、
1000行ずつやってみているのですが、1回に数分かかり、200回もやらなくてはいけません。
10000行やると1回に十数分かかり、だいたい15MBくらいの削減になるようです。

そこで質問なのですが、どれくらいずつやるのが良いと思いますか?
よろしくお願い致します。
669668:2010/11/12(金) 07:34:03 ID:???
>>668です。
mysqli関数ではなくmysqlidクラスで、INSERTO INTOではなくUPDATEでした。
よろしくお願い致します。
670NAME IS NULL:2010/11/12(金) 09:28:13 ID:???
OPTIMIZE TABLEは20万行全部終わってから1回だけ実行するんだと思う
671NAME IS NULL:2010/11/12(金) 09:31:33 ID:???
あとプログラムで1行ずつやるよりは、こうしたほうが速いと思う。

CREATE TABLE temp AS SELECT id, SUBSTR(description, 0, 200) FROM entry;
DROP TABLE entry;
RENAME TABLE temp TO entry;
672668:2010/11/12(金) 10:23:24 ID:???
>>670-671
ありがとうございました!
笑っちゃうくらいすぐに完了して感動しました。
インデックスを含め700MB→230MBに削減できました。

教えていただいたSQLではインデックスやauto_incrementを含めて
複製することができないようだったので、
「SHOW CREATE TABLE entry;」の結果にAS以降をつなげてみました。
MySQLのSUBSTR関数は先頭が0ではなく1のようです。

思い切って質問してよかったです。
本当にありがとうございました。
673668:2010/11/12(金) 10:34:50 ID:???
>>672です。
正しくインデックスが張られていなかったようでした。
「SHOW CREATE TABLE entry;」の結果のカラム名「description」を
AS以降のSELECT文で使うSUBSTR(description,0,200)に変えたところ上手くいったみたいです。
最終的に700MB→330MBになりました。

以上、失礼します。
674NAME IS NULL:2010/11/12(金) 11:27:30 ID:MYvcRYh8
トランザクションの理解について質問です

try{
 $db->query(〜);//クエリ1:出金
 $db->query(〜);//クエリ2:入金
 $db->query(〜);//クエリ3:出納記録
 $db->commit();
}catch(〜){
 $db->rollback();
}

1)上記のようなクエリ処理の場合、commit()が実行されるということは
クエリ1、クエリ2、クエリ3は全部問題なく実行出来てるってことですよね?
いちいち各クエリのあとで確認用のselectだとかのクエリを発行しなくて良いんですよね?

2)クエリ2:入金処理の時に、たとえば「1口座当たり1000円を超えてはいけない」ってルールがあった時は
 $db->query(〜);//クエリ2:入金
 $db->query("select quantity from t2〜");//クエリ2-1:残高確認
 //残高抽出処理
 if(残高>1000){
  $db->rollback();
 }
 $db->query(〜);//クエリ3:出納記録
 …という感じにしたら良いんでしょうか?

素人質問ですみません、回答お願いします。mysql5です
675NAME IS NULL:2010/11/12(金) 13:16:46 ID:???
>>674
1)
その$dbとやらは、
SQLがエラったときちゃんとthrowするようになっているか?
なんかフレームワーク使ってるならいいんだろうけど、
素ならデフォでは投げてくれないぞ。

2)
参照より更新のほうが負荷が高いし、
ロック(FOR UPDATEとか)をするケースなども考えれば
普通は参照→更新。

今の金額をSELECT;
if( 取得した金額+足す予定の金額<1000 ){
 足すUPDATEをする;
}else{
 echo 入金エラーです
}

書いてから消しゴムかけるより、ふつう見た時点でダメなら書かないだろ?

あと不安だから1)に補足しておくけど、
auto_commit=0なりbeginなりstart transactionはしてるか?
途中でわざと絶対エラーになるクエリを発行して、
ちゃんとロールバックされてるかのテストとかするんだぞ。
676674:2010/11/12(金) 14:39:08 ID:MYvcRYh8
>>675
すみません、かなり省略して書いてしまいました。
推測の通り、frameworkで作っています

1)もちろん、例外をthrowします。また、starttransactionも実行しています。
try{}中でcommit()されるということは、クエリが全て成功したと考えて良い訳ですよね?

2)そうですね、query()の前に確認した方が良いですね。ありがとうです
677NAME IS NULL:2010/11/12(金) 15:23:10 ID:???
>>676
クエリはすべて成功したと考えてよい。

ちなみにこれも老婆心だとは思うけど
UPDATEは更新対象が0行でも正常終了するから気をつけて。
678NAME IS NULL:2010/11/12(金) 15:53:03 ID:CCE9XiI6
>>647
どなたか教えていただけると嬉しいです><
679NAME IS NULL:2010/11/12(金) 16:11:18 ID:???
>>647
難しいなぁ。
サブクエリ側で同じkey内のランダムな行をなんとかして
EXISTSでなんとかしてできそうな気がしたけどやっぱわからん。
680NAME IS NULL:2010/11/12(金) 16:18:21 ID:???
>>647,6
ORDER BY rand()を利用すればできるかもしれないけど、全件走査になるだろうしな。
件数が少ないならプログラム側でなんとかなるだろうし、件数が極端に多くなったらIDを
乱数で発生させて適度に抜き出したほうがいいだろうし。

乱数ソートはインデックスが効かないんだから、SQLでなんとかするよりもプログラム側で
なんとかするほうがいいでないかの。
681NAME IS NULL:2010/11/12(金) 16:47:20 ID:???
>>647
解決法は分からないんだけど・・・
差し支えなければ、どういう用途で使用するのか教えてくれる?
682665:2010/11/12(金) 16:53:46 ID:???
>665,>667です。
どなたかわかりませんでしょうか?(´・ω・`)
683NAME IS NULL:2010/11/12(金) 17:02:04 ID:???
>>682
とりあえず両者とも、クエリ発行直後の時点でechoなりログ吐くなりしてみたら?
そこの時点で同じなら、その後の処理になにかあるんだろう。
684NAME IS NULL:2010/11/12(金) 18:37:35 ID:???
>>647
ちょっとイカサマくさいが、どうでしょか?

select
(select id from test where `key`=m.`key` order by rand() limit 0,1) id
from
(select distinct `key` from test)m
;
685NAME IS NULL:2010/11/13(土) 21:15:04 ID:CaiJLbhU
最近データベースに画像を保存できると知りました。それで、テーブルの扱いについて質問です。

例えば同じサービスに日記と料理レシピの紹介機能があってそれぞれ写真をUPできるとき、
1)写真データは専用の写真テーブルに入れるべきでしょうか?
2)それとも日記テーブルとレシピテーブルに写真用カラムを作って入れるべきですか?

1)の場合、登録時も引き出し時にトランザクションの負荷が発生するし、
2)の場合、ユーザごとの合計アップロード容量を算出する時手間です

どうしたら良いでしょうか
合計容量の算出なんて各ユーザの管理画面でしか不要だから2)が正解でしょうか
それとも第3・第4のテーブルを使って効率的に実装する方法があるんでしょうか

どういう風に作るとどんな面で利点がある、という形で意見貰えると嬉しいです
初心者過ぎてDB設計の留意点などわからないので漠然とした質問になってすみません
よろしくお願いします
686NAME IS NULL:2010/11/13(土) 23:39:16 ID:???
ユーザの立場を想像して言うと、一枚の写真を日記とレシピの両方に
使いたい場合もあるだろうなぁ、とか思うんだな。
687NAME IS NULL:2010/11/13(土) 23:57:55 ID:???
>>685
>1)の場合、登録時も引き出し時にトランザクションの負荷が発生するし、
ここがわからん
別テーブルにすると更新も読み出しも負荷が高くなるって意味?

個人的には画像は無理にDBに入れんでも
ファイルでいいんジャマイカと思うが
688685:2010/11/14(日) 08:51:54 ID:OQDjesf5
>>686
ありがとうございます。確かにそうですね〜!
「日記の記入と一緒に画像UP」の他に「既存の画像アーカイブから選んで日記に貼りつけ」の
機能も必要ですね

>>687
あ、引き出し時はトランザクションいらないですね
でもjoinが発生するんでしょうか
>別テーブルにすると更新も読み出しも負荷が高くなるって意味?
はい、トランザクションとかjoinとか、そういうものが少しでも発生しないように
作った方が良いのかなと思いまして…

画像を普通にファイルとして保存する場合、利用ファイル容量の計算難しくないですか?
(PHP使ってるんですが… 任意のディレクトリ以下のファイル容量を
再帰的に取得できる関数があるのかな〜)
DBに画像登録なら、ファイルサイズも保存出来るからSUMで一発解決かなーと思いました
689NAME IS NULL:2010/11/14(日) 09:33:09 ID:???
画像自体はファイルで、そのデータだけDBいれときゃいいようなー
690NAME IS NULL:2010/11/14(日) 11:13:39 ID:???
>トランザクションとかjoinとか、そういうものが少しでも発生しないように


なんで瑣末な事をやたらと気にするのかね
691NAME IS NULL:2010/11/14(日) 11:40:59 ID:???
>>687
少しでも負荷を軽くしたいのならファイルで扱ったほうがいいと思うけどな。そもそも画像データ
そのものは検索対象にならないんだし。

>画像を普通にファイルとして保存する場合、利用ファイル容量の計算難しくないですか?
ファイル名と一緒にサイズも登録しておけばいいだけじゃないの。
692685:2010/11/14(日) 12:14:08 ID:OQDjesf5
>>689
なんか初耳です。データだけってのはどういうことですか?
ファイル容量のデータ(100kbとか)のこと?

>>690
大した負荷じゃないんですかね?
トランザクションもjoinも最近おぼえたので「なんか大層なことをしてしまってる」ような
気がしてるんですが。

>>691
>ファイル名と一緒にサイズも登録
これは689さんの言ってることと一緒でしょうか? そういうことですよね?
容量計算用のテーブルにファイルサイズを入れる、と。なるほど…
693NAME IS NULL:2010/11/14(日) 13:39:31 ID:???
>>692
>トランザクションもjoinも最近おぼえたので「なんか大層なことをしてしまってる」ような
>気がしてるんですが。

そりゃやらない場合よりはオーバーヘッドはあるよ。
ただ、それらをなるべく使わないようになんてのは、RDBを使う旨みをなるべく捨てようと
してるようなもんだわな。
まあとことん高負荷なサービス運営しようと言うところなら、一部その旨みを捨ててでも
システムへの負荷を下げるという技を使ってるかもしれないけど、こんなとこでこんなの
聞いてる人が作るものなら、先々は分らんが当面はそういう話は関係無いでしょ。
まずは実装の細かいとこでの効率なんかより、素直な設計のちゃんと動くものを作り
上げることを考えた方がよろし。

>データだけってのはどういうことですか?

画像データは普通のバラのファイルとして格納しといて、
そのファイルの情報(パス名とか)だけDBに入れておくってことだと思う。
694685:2010/11/14(日) 14:14:27 ID:OQDjesf5
>>693
あーなるほど、わかりました! ありがとうございました
695NAME IS NULL:2010/11/15(月) 10:36:42 ID:s7bzgzBD
画像はシステム的に破綻をきたしやすいよ。
DBにいれると例えばWeb側から画像表示となった場合、
(ローカルサーバにDBない前提だが)
ネットワーク越しにMySQLのポートを長時間つかむことになる。
ローカルでも同じことだけどね。
データ量がテキストの比じゃないからね。
俺も昔管理のしやすさを期待してそうしたけど大変なことになった。
696NAME IS NULL:2010/11/15(月) 12:57:23 ID:???
DBに入れて初回アクセス時に適当なディレクトリにコピーを作っておいて、二回目以降はそちらを参照。
一定時間が過ぎたらディレクトリから削除。
毎回DBから取得はキツいでしょ
697NAME IS NULL:2010/11/15(月) 14:45:11 ID:???
ぶっちゃけ、分散ファイルシステム(WindowsのDFSみたいな)を使うのがいい。
698NAME IS NULL:2010/11/15(月) 14:54:32 ID:???
Webの場合画像のデータURIスキームを納めればいいんじゃないの
その文字列をimg srcにつければリクエスト数も減るしお得
699NAME IS NULL:2010/11/15(月) 15:58:17 ID:???
デカいデータを取り出すのが遅いとかそういう話してるんじゃないのか
データURIスキーム使ってもそこは一緒じゃん
700NAME IS NULL:2010/11/15(月) 18:12:39 ID:???
2つの開発環境でdescのdiffを取っていて気づいたのですが、
片方ではあるビューのDEFAULT欄に元テーブルのカラムのDEFAULT値が
表示されるのですが、もう片方ではNULLとなります。
他にも片方で0000-00-00 00:00:00、もう一方でNULLになる箇所などがあります。

ビューのDEFAULTの欄なので、実質的な違いはないのですが、
これって仕様なんでしょうか?
それともバージョン違いのせい?(5.0.22と5.0.45)

できれば両方とも同じ表示になるようにしたいのですが、
ビュー再作成ではダメでした…
701NAME IS NULL:2010/11/15(月) 18:33:19 ID:???
データベース設計について相談させてください。

クーポンサイトの情報をWebapiから取得して、DBに登録したユーザーごとの
条件にマッチすればメールでお知らせするプログラムを作っています。

現在、 usersモデル、 alertkeywordsモデルと二つあります。
一人のuserは複数のアラートキーワードを作成できます。

この時、 ”同じクーポンを重複して同じメールアドレスに送らないようにしたいです。”

WebAPIからそれぞれのクーポンのIDが取得できるので、
新たに couponsモデルを作成し、  couponID、date、email、と3つのテーブルを作成。
アラートメールを送信したクーポンのidはcouponsモデルにデータを保存する。

毎回アラートメールを送信する前に、このモデルで以前にメールを送信したかどうか
チェックするというやり方を考えたのですが、これよりもっと綺麗なやり方は
あるでしょうか?

(わかりにくくて申し訳ありません。指定していただければ説明を追加いたします。)
702NAME IS NULL:2010/11/17(水) 10:10:48 ID:???
「mysql_insertid」って、auto_incrementなカラムじゃなくても使えるのでしょうか。

ソーシャルゲームのためのMySQL入門
ttp://engineer.dena.jp/2010/11/mysql-for-socialgame.html
というページに

## sql
CREATE TABLE `seq_log` (
`id` bigint(20) unsigned NOT NULL
) ENGINE=MyISAM
INSERT INTO seq_log VALUES (0);

## perl
my $sth = $dbh->prepare_cached("update seq_log set id=LAST_INSERT_ID(id+1)");
$sth->execute();
return($dbh->{'mysql_insertid'});

というコードがあったのですが、auto_incrementじゃないカラムに対してmysql_insert_idを使っているように見えます。
703NAME IS NULL:2010/11/17(水) 10:18:08 ID:6fPf9rex
into outfile 無しで標準出力にcsvファイルを吐き出す方法を
教えてください。
704NAME IS NULL:2010/11/17(水) 11:11:57 ID:???
>>702
LAST_INSERT_ID()は引数付きで使うと
引数の値をLAST_INSERT_ID()の値に設定して、その値をそのまま返す
mysql_insertidはLAST_INSERT_ID()の値だから、結果的に
mysql_insertid = LAST_INSERT_ID() = id+1 となる。
705NAME IS NULL:2010/11/17(水) 11:42:45 ID:BzgNGBOJ
ttp://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html
MySQL Connector/C++についてなんですが、
Connector/Cでいう

mysql_options(&mysql, MYSQL_SET_CHARACTER_NAME, "sjis")
に相当するものは無いでしょうか?
706NAME IS NULL:2010/11/17(水) 12:22:24 ID:???
>>704
なるほど、秘密はmysql_insertidではなく、update seq_log set id=LAST_INSERT_ID(id+1) というSQLのほうにありましたか。
感謝です。

もう一点質問ですが、mysql_insertidの値は、コネクションごとに保存されるのでしょうか。
たとえば時系列で
コネクション1: last_insert_id()の値を更新
コネクション2: last_insert_id()の値を更新
コネクション2: mysql_insertidを参照  (A)
コネクション1: mysql_insertidを参照  (B)
としたときに、(A)と(B)が同じ値になることはない、という理解でいいでしょうか。

707NAME IS NULL:2010/11/17(水) 22:01:18 ID:???
708NAME IS NULL:2010/11/18(木) 03:59:40 ID:???
>>707
ありがとうございます。ぜんぶドキュメントに書いてあるんですね。出直してきます。
709NAME IS NULL:2010/11/18(木) 17:54:31 ID:Gq4XALI6
600001,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
600002,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1
600003,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
600004,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

上記のようなCSVファイルを作成し、インポートを行いました。
すると、2番目以降のレコードは正常にインポートされて、selectでも検索出来るようになるのですが、
1番目のレコードはインポートされません。インポート結果も「Records: 3 Deleted: 0 Skipped: 0 Warnings: 0」となっており、
そもそも1番目にデータがある事を認識出来ていないようです。
これにはどのような原因が考えられるでしょうか?
宜しくご教示下さい。お願いします。
710NAME IS NULL:2010/11/18(木) 19:07:53 ID:Cf2TFxy8
ROLLBACKについて教えて下さい。

テーブル「tb」のストレージエンジンをinnoDBに変更し
SHOW CREATE TABLE tb; でENGINE=innoDBと表示されています。

その後コマンドプロンプトで
START TRANSACTION; を入力しテーブルtb
をDELETE FROM tb;で削除します。テーブル中身が空であるのも確認できてます。
そしてROLLBACK;でテーブルが元に戻ります。これは問題なくできます。

同じことをphpmyadminでSQLを入力すると、データは戻らない状態です。
ROLLBACK; も「SQLが正常に実行されました」と表示はされています。

XAMPP 1.7.3(PHP Version 5.3.1 MySQL Version5.1.41)を使用しています
このような場合どこに問題があるのでしょうか?
わかりにくい質問で申し訳ないですが、よろしくお願いします。
711NAME IS NULL:2010/11/18(木) 19:10:23 ID:???
http://dev.mysql.com/doc/refman/5.1/ja/load-data.html
[IGNORE number LINES]
を書いていないか、についてまず確認
712NAME IS NULL:2010/11/18(木) 19:11:06 ID:???
そりゃphpmyadminがそういうふうに作られているんでしょう
713NAME IS NULL:2010/11/18(木) 19:18:12 ID:7RuA6Gxf
暗黙のコミット 当たりの問題じゃないかと予想
714NAME IS NULL:2010/11/18(木) 19:28:08 ID:Cf2TFxy8
>>711
すいません、自分へのアドバイスでしたらよくわかりません(709?)
急に会社命令で学ぶことになったので
>>712
phpmyadminではROLLBACK;は使えないのでしょうか?データの復元とか
できないのでしょうか?
715NAME IS NULL:2010/11/18(木) 19:35:38 ID:???
プログラム上から、もしくは専用のGUIツールからならわかるが
phpmyadminからトランザクションはれるってあんまりイメージ沸かないな、
できないんじゃね?知らないけど。調べれ。
716NAME IS NULL:2010/11/18(木) 19:49:50 ID:Cf2TFxy8
>>713
暗黙のコミットって初めて聞きました。検索したらトランザクションが
勝手に終了されると・・・関係ありそうなのでもう少し調べてみます。

>>715
実際の現場ではphpmyadminでトランザクションはつかわない
みたいなんですね。
717NAME IS NULL:2010/11/19(金) 14:24:41 ID:VrwkXLqe
710です。
教えてもらった暗黙のコミットなどを調べてみましたが、いい方法が
見つからずphpmyadminでロールバックはできませんでした。
今はあきらめて先に進もうと思います。

そこでコマンドプロンプトで学んでいこうと思ったのですが、そこでも
ちょっと困ってて教えて欲しいことがあります。
テーブル「ta」にフィールドがaで値が100が入力されてるとします。
START TRANSACTION; して UPDATE ta SET a=200;を実行します。
値は確かに200になっています。

ここでコミットせずにEXITでmysqlを終了し、また起動すると通常は100に
戻るみたいなのですが、私の場合は200になっています。
書籍にはコミットせずに終了すると自動的にロールバックされると書いてある
のですが、コミットされてるようです。
上記のような時は何が原因なのでしょうか?
718NAME IS NULL:2010/11/19(金) 14:39:21 ID:???
varchar型で1万文字以上格納できるようなんですが、
text型と使い分ける目安はどの程度なんでしょうか?
varcharに入るなら全部varcharに入れてしまった方がいいんでしょうか?

入力される値は0文字から4000文字程度と仮定。
MySQL-5.1.37でInnoDB使用。
719NAME IS NULL:2010/11/19(金) 14:46:57 ID:VrwkXLqe
すみません、717のコマンドプロンプトの質問はデータベースの指定ミスでした。。。
720NAME IS NULL:2010/11/19(金) 20:45:33 ID:lhdsvAaN
>>719
どういうミスだったの?
721NAME IS NULL:2010/11/19(金) 21:58:23 ID:???
>>718

ttp://dev.mysql.com/doc/refman/4.1/ja/blob.html
ほとんどの面において、TEXT 型のカラムは、任意の長さに設定できる VARCHAR 型の
カラムとみなすことができます。同様に、BLOB 型のカラムについては、VARCHAR BINARY
型のカラムとみなすことができます。相違点は以下のとおりです。

*MySQL バージョン 3.23.2 以降では、BLOB 型と TEXT 型のカラムには、インデックスを
 付けることができる。それより前の MySQL バージョンでは、インデックスはサポートしていない。
*VARCHAR 型のカラムでは値の格納時に後続のスペースが削除されるが、
 BLOB 型と TEXT 型のカラムではこの削除は行われない。
*BLOB 型と TEXT 型のカラムには、DEFAULT 値は設定できない。
722NAME IS NULL:2010/11/19(金) 22:11:09 ID:VrwkXLqe
>>720
エンジンがMyISAMのままでした。お恥ずかしい・・・
なんでかな〜と結構考えてイライラしたんですけど、でも解決してMYSQLが
少しおもしろくなってきました。
phpmyadminでトランザクションやロールバックがうまくいかないのは
まだ解決してないですけど
723NAME IS NULL:2010/11/19(金) 22:29:16 ID:???
>>722

php mysql トランザクション でぐぐって
http://redwarcueid.seesaa.net/article/140085587.html
というのが出てきたんで見ると

最後にトランザクションをはじめる準備というところはautocommitが1の場合は
トランザクション中でも関係なくクエリが成功するとその場で
コミットしてしまうので0にしてトランザクションを始めましょう
注意しましょう

とかってあるけど、そこらへんはどうなの?
724NAME IS NULL:2010/11/19(金) 22:57:04 ID:???
>>721
ありがとうございます。
挙動の違いはだいたい理解できました。

あとは、パフォーマンスの違いと、
どう使い分けるのか、それとも一方に統一した方が楽なのかがイマイチ分かりません。
725NAME IS NULL:2010/11/19(金) 22:59:27 ID:FsIBdfpB
1つのページを表示するまでに発行されるクエリーの回数って100回くらいなら問題ないよね?
726NAME IS NULL:2010/11/20(土) 00:00:30 ID:J6lwghrY
質問です。MySQL5以降で、

A
| user_id | boolean |
---------------------
| 1 | 0 |
| 2 | 1 |
| 3 | 1 |

B
| user_id | boolean |
---------------------
| 2 | 0 |
| 3 | 1 |

U
| user_id | name |
------------------
| 1 | aaaa |
| 2 | bbbb |
| 3 | cccc |

というA,B,Uというテーブルがあるときに、
下記のようなデータを取得することは可能でしょうか?

| name | A.boolean | B.boolean |
--------------------------------
| aaaa | 0 | null |
| bbbb | 1 | null |
| cccc | 1 | null |
| bbbb | null | 0 |
| cccb | null | 1 |
727NAME IS NULL:2010/11/20(土) 01:12:02 ID:nLvBHSFA
ttp://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html
MySQL Connector/C++についてなんですが、
Connector/Cでいう

mysql_options(&mysql, MYSQL_SET_CHARACTER_NAME, "sjis")
に相当するものは無いでしょうか?
728NAME IS NULL:2010/11/20(土) 01:17:58 ID:???
>>726
各々、left outer joinしたものをunion allするしかあるまい
片方は、必ずNULLになるわけだし。
729726:2010/11/20(土) 01:57:35 ID:???
>>728
ありがとうございます!
今まで遭遇しないタイプだったので、結合だけで、
なんとかできないか試行錯誤してましたが
UNION ALL で目的が達成できました!
730NAME IS NULL:2010/11/20(土) 11:28:04 ID:Vq8d/kdN
>>723
それもやってみました
SET AUTOCOMMIT=0; をしたあとでテーブルのレコードを消し、
それからROLLBACKしても戻らないです。
SET AUTOCOMMIT=0;の後にSTART TRANSACTION;も入力して
そのあとレコード消したりもしましたが戻りません。

確認のため随所でSELECT @@AUTOCOMMITでオートコミットの状態をみると
AUTOCOMMIT=1のままでした。0にならないみたいです。
このあたりが問題なのかな?
731NAME IS NULL:2010/11/20(土) 20:03:34 ID:???
MySQLでswap出たら開放されないのって仕様かな?
732NAME IS NULL:2010/11/22(月) 17:48:34 ID:???
ずっと前に、メールアドレスはREVERSEで反転して登録すると、
インデックスとして使うときにいいって記事読んだ覚えがあるんですが、
ソースが見あたりません。

このテクニックについて参照できる記事をご存じのかたや、
またご意見があるかたはお聞かせいただけないでしょうか。
733NAME IS NULL:2010/11/22(月) 19:29:55 ID:???
えらくクセのある運用方法だな
一概にいいとは言えないはずだけど・・
734NAME IS NULL:2010/11/22(月) 20:41:36 ID:???
たしかにBTREEだったら逆のほうがよさそうだね。
おもしろいw
735NAME IS NULL:2010/11/22(月) 20:51:07 ID:???
あまりに初歩的な質問で悪いんですけどデータベースの初期化って
mysql_install_db ですよね?
OSはCentOSなんですけど、一度yum remove (ryでアンインストールした後、もう一度入れても初期化されてくて
上のをやってみても初期化されてないのですけど、初期化のやり方間違ってますか?
736NAME IS NULL:2010/11/22(月) 21:11:04 ID:???
>>735
既存のデータベース/テーブルが存在する場合は、一切それらに手をつけない
旨公式のリファレンスに書いてあるハズだが・・・。

yum で removeっても、/var/lib/mysql 下はクリアされないハズなので、
rm -rf で一旦消しましょう。
(もちろん、以前に作成したユーザーや権限は全て失われるので、
 失いたくなければ他所にコピーするなりする)
737NAME IS NULL:2010/11/22(月) 21:31:48 ID:???
>>736
レスありがとうございます。
公式のどこを見ればいいのかわからない程の初心者でして。
スレ汚し失礼致しました。
738NAME IS NULL:2010/11/23(火) 00:26:15 ID:???
あー確かに メールアドレス逆のが効率は良さそうね 確かにおもろいw
739NAME IS NULL:2010/11/23(火) 08:48:16 ID:???
Macの各アプリなんかの環境変数(?)は開発者サイトのホスト名を逆にしたようなものをキーにしてるのは、同じようなもんなのかな?
defaults write com.apple.xxxx true
みたいな。
740NAME IS NULL:2010/11/23(火) 21:47:39 ID:???
>>732
ドメインで範囲検索する場合は有効かも知れんけどね。 like 'ten.hc2.%' とか。
そうでなけりゃ、めんどくさいうえにキーの分離が悪くて効率落とすだけ。
何にしても要件次第。
741NAME IS NULL:2010/11/23(火) 23:17:43 ID:???
データベースの管理に、MySQL GUI Tools を導入したんですが
セットの MySQL Queru Browser ではテーブル内の日本語データが
文字化けしてしまいます。

出来ればこの純正SETを使いたいので、日本語対応させたいのですが
何か方法はありますか?
742NAME IS NULL:2010/11/24(水) 01:25:52 ID:???
>>741
EOL(=メンテ終了)って書いてあるのに何で無視するかな。
素直にworkbenchを使え。
743NAME IS NULL:2010/11/24(水) 03:27:34 ID:???
innoDBでINSERT IGNOREやINSERT ON DUPLICATE KEY UPDATEをしたとき、
行が増えていないのにオートインクリメントが繰り上がってまう。

すぐIDがパンクするんだけどこれって何とかならないかな。
744NAME IS NULL:2010/11/24(水) 13:41:24 ID:???
workbenchって使いにくくない?最近は変わったのかな、入れてみよう。

俺もquery browser使ってる。日本語は入れないようにしてるor必要なときだけ他のクライアントで。
745NAME IS NULL:2010/11/24(水) 14:50:13 ID:???
workbenchってカラムの変更出来る?
テーブル内データだけしか操作出来ない気がするが。
あとはQUERY入力
746NAME IS NULL:2010/11/24(水) 17:57:55 ID:???
俺もworkbench一度入れたけど、クエリブラウザ的な使い方がわからなくて
結局クエリブラウザ使ってる。
747NAME IS NULL:2010/11/24(水) 20:36:35 ID:???
正直使いやすいとはあまり思わないし、重いのだけど
単なるクエリ実行から、GUIでテーブル作成/変更したり
ユーザーの管理もできるようになってる
utf8でしか使ってないけど、日本語も問題なさげ。

最近MySQLを使うようになったから
クエリブラウザと比べてどうというのはわからん
748NAME IS NULL:2010/11/24(水) 22:01:44 ID:???
WinでNavicat Liteしか使ってねーっす
749NAME IS NULL:2010/11/24(水) 22:09:18 ID:???
>>743
INTEGERで溢れるならBIGINTにすりゃいんじゃね?
750NAME IS NULL:2010/11/24(水) 22:15:21 ID:JnCRimrA
ストレージエンジンにInnoDBを使っています。
あるテーブルやインデックス用のファイルの情報(ファイルサイズとか)を
mysqlクライアントから知る方法はあるでしょうか。
Oracleでいうdba_data_filesのようなものがあるとうれしいのですが。
751NAME IS NULL:2010/11/25(木) 00:06:23 ID:???
>>749
ありがd
なんで解決策がどこにもないんだよ……orz
とか思ってたら、誰も解決の必要性に駆られなかったのね。

BIGINTにすれば毎秒1億件更新してカウンターを釣り上げても100年は余裕だったのか。
752NAME IS NULL:2010/11/25(木) 09:58:10 ID:???
>>750
SHOW TABLE STATUS\G
753NAME IS NULL:2010/11/25(木) 13:06:00 ID:???
空のテーブルをOPTIMIZEする意味ってありますか?InnoDBのテーブルです。
754NAME IS NULL:2010/11/25(木) 13:55:48 ID:???
>>753
TRUNCATEして空になったテーブルなら意味ない。
DELETEして空になったテーブルなら意味ある。
755NAME IS NULL:2010/11/25(木) 14:10:15 ID:???
>>754
なるほど、理解できました。ありがとうございます。
756NAME IS NULL:2010/11/25(木) 15:37:24 ID:???
稼働中のMySQLに入っているデータを全文検索する必要があり、
その方法を探しております。
ネットで調べると、trittonというプロジェクトが見つかったのですが、
MyISAM限定のためトランザクションが使えないようです。
全文検索とトランザクションを両立出来るような方法は無いでしょうか?
mecabというフリーのエンジンがありますがこれをMySQLのデータと連携させることなどは可能ですか?
全文検索を実現しているWebサイトはたくさん見かけますが一般的にどのように実現されているのかを知りたいです。
757NAME IS NULL:2010/11/25(木) 16:53:44 ID:???
>>756
MeCabは以下のいずれの方法でも必要。それ単体でMySQLの全文検索はできない

# MySQL 5.0系
MyISAM + Tritonn用のDBを別に立ててレプリケーションのスレーブにする
全文検索時参照用DBとしてアプリ側で接続先を制御

# MySQL 5.1系
mysqlftppc mecab plugin を使う
これも「まだ」MyISAMしか対応してないはずなので、れぷり(ry


人柱になるならgroongaストレージエンジン(5.1系)
クエリのテスト見る限り、トランザクションは使えない様子


全文検索用にテーブルつくって、マスタ文書の更新、挿入時に
そっちに放りこむようにしてもいいんじゃないかな
758756:2010/11/25(木) 19:26:18 ID:???
>>757
とても貴重な説明ありがとうございます。
こういう情報はネットで集めるのはなかなか難しいですね。。

レプリケーションにするのは自分には少しハードルが高いので
全文検索用のテーブルを別に作る方法で行こうと思います。
759NAME IS NULL:2010/11/25(木) 22:53:37 ID:tKFy4xSJ
>>752
ありがとうございます。
Data_lengthを見るんですね。
760NAME IS NULL:2010/11/26(金) 22:22:45 ID:???
誰かMySQL Clusterの設定方法とか詳しく書いてるサイト教えて。
761NAME IS NULL:2010/11/26(金) 22:56:13 ID:???
topコマンドを叩くと、mysqldのCPU使用率が常に140%程度になっております。
(load averageは常に6〜8程度)

原因としてはやはり重いクエリが実行されている可能性が高いのでしょうか?
スロークエリログを取りたいのですが、mysqld実行時にオプションを付けて起動しないといけなかったようなのでログを取ることが出来ません。
どのように調査を進めればいいのかアドバイスを頂けないでしょうか。
762NAME IS NULL:2010/11/27(土) 01:21:46 ID:???
オプションつけて再起動すればいいじゃないか
763NAME IS NULL:2010/11/27(土) 13:54:57 ID:???
>>762
実稼動中で今さら再起動できませんコッソリ対処したいんです
っていうことだろ言わせんな恥ずかしい
764NAME IS NULL:2010/11/27(土) 14:16:04 ID:???
再起動しても数秒クエリが止まるだけで不整合にはならないし
それでシステム全体が不具合でるならそれはそれで堅牢性がやばい。

とりあえずshow full processlistで秒オーダかかるクエリは見えるから
explain付けて再実行してみたらいいよ。
765NAME IS NULL:2010/11/27(土) 19:16:46 ID:???
InnoTopとかツールを入れて、クエリを全部とって、
それぞれexplainして実行計画を見るとか。
まぁCPUがそんだけ上がるのはほぼ間違いなくINDEX使ってない重いクエリだろうね
後は無茶な件数のソートか。
766NAME IS NULL:2010/11/28(日) 02:00:34 ID:bvaFGsGN
統計解析関係の関数が無くて困ってます
助けてください。
いいリファレンスは無いですか?
767NAME IS NULL:2010/11/30(火) 18:27:41 ID:???
mysql 5.1.38

mysqldumpで差分バックアップとかって出来ます?
768NAME IS NULL:2010/11/30(火) 21:32:36 ID:???
>>767
出来ないのでは?
差分ならバイナリログかな?
769NAME IS NULL:2010/12/01(水) 06:53:42 ID:???
>>768
ありがとです。
そちらの方を少し調べてみます。
770NAME IS NULL:2010/12/02(木) 17:29:45 ID:???
このツールの質問はこちらでよろしいでしょうか?

SQLyog trial -MySQL GUI v8.71 を使って、特定tableを正常な文字で表示したいのですが、

DB内に「・ト」「・・ツ」「・B」と言った化けた文字が出てしまい、
まともに何が書いてあるか分かりません。ここに貼ると形が変わってしまいますが、黒塗りの「?」のような文字だったり、♀だったりします。
おそらくlatin1の文字だと思うのですが、
このように化けてしまった文字を編集する方法はありますでしょうか?数値の欄なので、これらの文字は
何かしらの数字を表していると思います。
771NAME IS NULL:2010/12/03(金) 21:30:49 ID:???
稼働中のMySQLのあるテーブルのカラムにインデックスを付加したいのですが、
単純にcreate indexを実行するだけで良いのでしょうか?

自分の認識では、インデックスとは索引テーブルを持つことだという認識なので、
どこかのタイミングでそのテーブルが作成されなければならないと思うのですが、
create indexを実行した時に索引テーブルも作成されるのでしょうか?
create indexを実行した直後から、インデックスの効果が現れると考えて間違いないですか?
772NAME IS NULL:2010/12/03(金) 21:55:27 ID:???
>>771
>単純にcreate indexを実行するだけで良いのでしょうか?
Yes

>create indexを実行した時に索引テーブルも作成されるのでしょうか?
Yes (「索引テーブル」とは呼ばないが)
レコード数が多いとそれだけ create index の処理時間も長くなる

>create indexを実行した直後から、インデックスの効果が現れると考えて間違いないですか?
Yes
773771:2010/12/03(金) 22:16:56 ID:???
>>772
ありがとうございます!
今実際に50万件程度のレコードがあるテーブルに実行してみましたが、10分ぐらいかかりました。
その間テーブルにロックがかかりサービスがほとんど停止状態に。。
すごく焦りましたが何とか上手くいきました。
774NAME IS NULL:2010/12/03(金) 23:56:02 ID:???
>>772
>>create indexを実行した直後から、インデックスの効果が現れると考えて間違いないですか?
>Yes

そりゃ違うと思うんだがの。
「create indexが終了した直後から」ならyesだろうが。
775NAME IS NULL:2010/12/04(土) 18:34:39 ID:???
レンタルサーバを乗り換えたときにMySQLのバージョンが上がってしまい、これまで
提供していたサービスが使用できなくなって困っています。

以下のようなスクリプトで、PHP5のPDOを使用してアクセスしていているのですが、
$sql = 'UPDATE link SET code=?, site_name=?, site_url=?, banner=?, category=? WHERE code=?';
$stmt = $dbh->prepare($sql);
$stmt->execute(array($new_code,$site_name,$site_url,$banner,$category,$code));
バージョンアップ後は、
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in...
と出てエラーになり動かなくなってしまいました。

errorInfoで出力したところ、
array(1) { [0]=> string(5) "HY093" }
と出ていて、どうも?の数とarrayの引数があっていないような感じです。

なお、
$sql = 'UPDATE link SET code=' . $new_code . ', site_name="' . $site_name . '", site_url="' . $site_url . '", banner="' . $banner . '", category="' . $category . '" WHERE code=' . $code;
のように引数を直書きすると正常に動きました。

ただ似たような部分はほかにも多くあり、できれば今の方式で対応したいです。
原因と対処方法をご教授いただけないでしょうか。
よろしくお願いいたします。
776NAME IS NULL:2010/12/04(土) 19:42:02 ID:???
>>775
MySQLじゃなくてPHP(PDO)の問題では?
レンサバ変えてPHPも上がったのでは?
777NAME IS NULL:2010/12/04(土) 22:16:45 ID:???
>>776
返信ありがとうございます。
元のサーバーのバージョンはもう確認できないのですが、おそらく
上がっていると思います。
ちなみに現状は、
PHP 5.2.11
MySQL 5.0.87
です。
PHPのバージョンが上がるとそこまで大きな仕様変更が起こったりするのでしょうか。
てっきりこの程度の下位互換はあるのかと思っていましたが。。

また後だしになってしまい申し訳ないのですが、他の場所の稼働確認をしてみたところ、
同じ構文で正常に動いている部分もあることがわかりました。

ということは、上記の書き方が間違っているのでしょうか。。?
778NAME IS NULL:2010/12/05(日) 01:04:32 ID:???
>>777
PHPは、二つ目の数字が変更されるときは、
かなりの変更があります。
5.1→5.2とか、5.2→5.3で、動かなくなった
ものがけっこうありますよ。
779NAME IS NULL:2010/12/05(日) 16:04:56 ID:???
>>778
そうなんですか。。
以前のところはPHP4or5と書いてあるのみで、phpInfo()なども実行したことがないので
5.0か5.1だったのかもしれませんね。。

情報ありがとうございます。
780NAME IS NULL:2010/12/06(月) 18:57:24 ID:???
【MySQL】ドワンゴ技術勉?強会(2)【はじまった】
ttp://live.nicovideo.jp/watch/lv33653557

19:00 MySQL pluginについて(ドワンゴ/鬼海/星野/中村)
20:00 Spiderストレージエンジン(チームラボ/斯波様)
21:00 LT(ドワンゴ/鳥居)
21:10 MySQLを通じた全文検索エンジンSenna/Groongaの利用について(ブラジル/末永様)

ニコ生でこんなのやってるね
781NAME IS NULL:2010/12/06(月) 19:16:28 ID:???
タイムシフト視聴できねーのかよ
782NAME IS NULL:2010/12/06(月) 21:27:50 ID:???
タイムシフトは終わってからじゃね?
783NAME IS NULL:2010/12/07(火) 15:52:55 ID:???
20G程のデータをを持っているdatabaseを削除したのですが、
dfコマンドで確認しても削除前と容量が変わっていません。
しかしdatabaseは削除されています。

drop databaseコマンドではデータ本体は削除されないのでしょうか?
もう使わないdatabaseなのできれいさっぱり削除したいのですが、
どのように削除するのが正しい方法ですか?
784NAME IS NULL:2010/12/07(火) 18:04:09 ID:iYpdO+Wq
10桁の金額を収めるカラムをつくろうと思いますが、
BIGINTで問題ないでしょうか?
整数しか収めないのでBIGINT型でも問題ないかなと思っていますが、
みなさんはどのように設計されてますか?
DECIMALですか?
785NAME IS NULL:2010/12/07(火) 18:13:41 ID:???
>>784
INT
786784:2010/12/07(火) 18:41:27 ID:???
>>785

ありがとうございます。

質問なのですが、INTですと最大値が
2147483647
だと理解しているのですが、これだと
10桁MAXの9999999999
が溢れちゃうと思うのですが大丈夫なのでしょうか?

ちなみにMYSQLは5を使用しているので
http://dev.mysql.com/doc/refman/5.1/ja/numeric-types.html
こちらを参考にしています。

787784:2010/12/07(火) 18:43:52 ID:???
今INTの列に9999999999を入れたら
2147483647で入ってました。。。。
788NAME IS NULL:2010/12/07(火) 19:01:28 ID:???
リンクされたとこを読めば、、、
bigintのunsighedなら、18446744073709551615まで入るって書いてある。

プログラムから、MySQLへアクセスしてるからでしょ。
変数の型も合わせないと。
789784:2010/12/07(火) 20:32:06 ID:???
>>788

回答ありがとうございます。

>bigintのunsighedなら、18446744073709551615まで入るって書いてある。
おっしゃるとおりです。
同じようにINTについては
符号ありで2147483647
符号無しで4294967295
と書いてあるので787での挙動は問題ないと思っています。

BIGINTで試したところ9999999999も入ってたので
ドキュメント通りだと思ってます。

>>785さんはINTと回答されてたので、
INTとBIGINTを同一のものとして話されてると察することができませんでした。


あと気になったのは先程のURLの中の
>DECIMAL と NUMERIC データタイプは、真数値データ値を格納するために利用されます。
>MySQLでは、NUMERIC は DECIMAL として実行されます。これらのタイプは、
>金銭データ等の正確な精度を必要とする物を格納するために利用されます。
こちらの部分を考慮したときに、みなさんは
BIGINTで設計するのかDECIMALで設計するのか
気になったので質問させていただきました。

みなさんはどの様に設計されてますか?
>>785さんの言うとおりINTでされているのでしょうか?
790NAME IS NULL:2010/12/07(火) 20:47:03 ID:???
5.1.46

with rollupについて教えてください

select
id,sum(cnt)
from rolluptest
group by id with rollup;
の結果、
791NAME IS NULL:2010/12/07(火) 20:48:05 ID:???
+------+----------+
| id | sum(cnt) |
+------+----------+
| 1 | 2000 |
| 2 | 3000 |
| 3 | 1000 |
| 4 | 3000 |
| 5 | 1000 |
| NULL | 10000 |
+------+----------+
6 rows in set
792NAME IS NULL:2010/12/07(火) 20:48:45 ID:???
この最後のnullの所に '小計'という文字を入れたいのですが
select
case
when id is null then '小計'
else id
end as i
,sum(cnt)
from rolluptest
group by id with rollup;
でもNULLのままです。
どうすれば宜しいんですかね
793NAME IS NULL:2010/12/07(火) 20:52:04 ID:???
>>789
小数が必要ならDECIMAL、不要ならBIGINT
ただしBIGINTでも収まらないことが考えられるならDECIMAL

円なら通常BIGINTでいいんじゃね?
794NAME IS NULL:2010/12/07(火) 21:02:34 ID:???
>> 792

ttp://dev.mysql.com/doc/refman/5.1/ja/group-by-modifiers.html

クライアント側でなんとかせい、ってことではないですかね
795NAME IS NULL:2010/12/07(火) 21:48:43 ID:???
>それらをクエリそのものの中で NULL 値としてテストすることは
できません。
http://dev.mysql.com/doc/refman/5.1/ja/group-by-modifiers.html

なんてこったいw

>クライアント側でなんとかせい、ってことではないですかね

わかりました w
796NAME IS NULL:2010/12/07(火) 22:06:41 ID:???
俺の環境だと上手くいくんだけど・・・

mysql> select
-> case
-> when id is null then '小計'
-> else id
-> end as i
-> ,sum(cnt)
-> from test
-> group by id with rollup;
+------+----------+
| i | sum(cnt) |
+------+----------+
| 1 | 2000 |
| 2 | 3000 |
| 3 | 1000 |
| 4 | 3000 |
| 5 | 1000 |
| 小計 | 10000 |
+------+----------+
6 rows in set (0.02 sec)

mysql> select version();
+------------------+
| version() |
+------------------+
| 5.1.50-community |
+------------------+
797784:2010/12/08(水) 13:29:46 ID:???
>>793
ありがとうございます。

ひとまずBIGINTで定義してみます。
798NAME IS NULL:2010/12/08(水) 22:49:10 ID:???
Oracleのストアドインポートするツール
教えてください
799NAME IS NULL:2010/12/09(木) 08:42:09 ID:???
ggrks
800NAME IS NULL:2010/12/10(金) 23:48:37 ID:???
Oracleのパッケージを変換するツール
教えてください
801NAME IS NULL:2010/12/11(土) 04:29:27 ID:???
ないよそんなの
802NAME IS NULL:2010/12/11(土) 14:58:35 ID:???
今年初めにSun(MySQL ABを買収したとこ)をORACLEが買収したとは言え、
ORACLE系DBと連動や移植、それに差別化とかはどうなってるのかねぇ?
803NAME IS NULL:2010/12/11(土) 15:39:44 ID:???
>>802
お前が情弱ってことは理解してあげたから、このスレのログぐらい読んでから
レスする程度の知能はつけろよ…
804NAME IS NULL:2010/12/11(土) 15:42:01 ID:???
>>802
MYSQLをつぶす方向に進んでるよ
サポート料金も跳ね上がったとか
805NAME IS NULL:2010/12/11(土) 18:45:04 ID:???
【RoR】Ruby on Rails Part11
http://hibari.2ch.net/test/read.cgi/php/1292032736/4

これほんと?
806NAME IS NULL:2010/12/11(土) 21:15:51 ID:???
>>804
ちゃんと内容読んでこいよ。
安いほとんどサポート内容のないプランをやめただけ。
残ったプランは前と比べてよくなった部分も多い。

つぶそうとしてるかはわからん。まぁ潰れたとしても他に多くのforkがあるし、完全に死ぬことはないだろう。
807NAME IS NULL:2010/12/11(土) 22:36:17 ID:???
mysql 5.1.41 OS XP

トリガー、ストアドプロシージャなどをバックアップするのってどうするんですか?
808807:2010/12/11(土) 22:58:42 ID:???
mysqldump --no-create-db --no-create-info --no-data --routines <dbname>
で出来るみたいです
んん、、、、スレ汚しヾ(゚д゚;) スッ、スマソ
809NAME IS NULL:2010/12/12(日) 00:37:42 ID:???
oracleのストアドをさくっと書き換えるコツ
教えてください
810NAME IS NULL:2010/12/12(日) 10:19:54 ID:???
それもない
ストアド移植するならPostgreSQLにしたほうがまだまし
あっちはPL/pgSQLあるし
811NAME IS NULL:2010/12/12(日) 19:29:59 ID:???
MySQLってストアドもないのか
ダメ過ぎる
812NAME IS NULL:2010/12/12(日) 19:33:28 ID:???
Web系のスキルの低さをなめんな。
セットで使われるのはPHPなんだぜ?
813NAME IS NULL:2010/12/12(日) 19:44:33 ID:???
>>811
お前が無知なのと自分で調べる能力がないバカなのはわかった。
ストアドプロシージャ自体は存在する。PL/SQLのような言語がないってだけだ。

しっかし、この手のバカは粘着するんだよなぁ…
814NAME IS NULL:2010/12/12(日) 21:45:13 ID:???
ストアドが無くても代換があり速度もそこそこならば
無くても問題なさそうな気はするが。
815NAME IS NULL:2010/12/13(月) 09:25:28 ID:???
>>814
簡単な移行手段が無いのが問題かと思う。
同じことが同じソースで書けないのはつらい。
816NAME IS NULL:2010/12/13(月) 12:44:50 ID:???
DBMS間でのSQLの移植性なんてあってないようなものだもんなあ
複数DBMS対応で売ってるものって実際問題どうしてるんだろう?
817NAME IS NULL:2010/12/13(月) 13:26:00 ID:???
DBMS固有の機能を使わなければいいだけじゃないの?
818NAME IS NULL:2010/12/13(月) 15:01:12 ID:???
FULL OUTER JOIN っていつからサポートされたんだっけ?
819NAME IS NULL:2010/12/13(月) 16:29:20 ID:???
PHPのarray(64文字の文字列を30個)をMySQLで保存しておきたいのですが、どのような実装が一番スマートでしょうか?
今考えているのがSQL上にlog0〜log30という名のフィールドを確保して一行づつ保存する方法と、PHPのserializeを使って一つにまとめてから保存する方法を考えています。
前者はフィールドを配列の個数分確保するのがダメっぽいし、後者は一行の変更でも全部書き換えるのがダメっぽくて実装に踏みきれません。
820NAME IS NULL:2010/12/13(月) 16:37:40 ID:???
30個しかないなら後者の方法で一行更新したってたかがしれてるとは思うが
配列のキーのフィールドと値のフィールドでテーブルを作ればいいんじゃないのか
821NAME IS NULL:2010/12/13(月) 16:49:22 ID:???
すみません、説明不足でした。
db_userというテーブルにidその他のフィールドがあって、個人のデータとしてログのようなものを30行保存したいのです。
serializeで処理してしまっていいんですかね…
822NAME IS NULL:2010/12/13(月) 17:30:28 ID:???
なんか目的がちょっと想像出来ないけど、
頻繁に更新するなら後者の方がいいような気もする。
また、一時的なものならmemcachedとかの方が楽そう。
serializedせずそのままarrayを入れられるし。
823NAME IS NULL:2010/12/13(月) 17:33:03 ID:???
log テーブルを新規作成
1 user 毎に最大 31 レコード存在する
824NAME IS NULL:2010/12/13(月) 17:58:15 ID:???

>>822
データは個人の行動のログを最大30件記録して、そのidに関わりのある他のユーザーが参照するものです

実は現在 >>823 の方法でデータを持っています。
db_logにidとlogを持つ方法です。
ユーザー数が少ないうちはいいのですが、ユーザー数が増加した場合の負荷が心配です。
自分のデータ更新、他人からの参照でサーチが大量に発生するため、どうせ読み込むことになる固定長の個人データとセットにしたほうが効率が良いのではないかと判断しました。

とはいえ、db_logにまとめて突っ込む場合でもユーザーidのインデックスは効くはずなので不必要な処理かもしれません…
「効くはず」と不明瞭なのは、例えば
1.ユーザー1のログが5行追加(同時に以前の5行を削除)
2.ユーザー2のログが2行追加(同様に削除処理)
3.ユーザー1のログが3行追加(同様に削除処理)
と、追加のタイミングと長さが不定のデータで本当にidのインデックスが有効に機能しているのか分からないためです。
うまい具合に機能しているのなら現在の方法でいいのでしょうか?
825NAME IS NULL:2010/12/13(月) 18:17:58 ID:???
それで機能しなくなるなら
なんのためのインデックスだって話だよ

ただし追加削除時にインデックス更新のオーバーヘッドはあるよ
826ビギナー君:2010/12/13(月) 23:06:30 ID:???
MYSQLを使ったプログラムを始めたばかりのビギナーです。
どうしていいか分からなくて行き詰まったのでどなたか教えて頂けないでしょうか?

データベースの中で、データにIDを採番していく事にしたのですが、新たなデータ作成時にそのIDが採番済みかを調べるのに、
BINARY型の255バイトのデータ数千個で管理しようと考えました。(IDは途中が削除されて空き番に成り得ます)
IDが1番から順番に、そのデータの対応ビットをONOFFして採番済みかチェックし、ビットOFFなら採番済みとしてそのIDでデータ追加可能にする感じです。

ですが基本的な部分ですがこのデータ手動での初期値投入方法が分かりません。
INSERT文で入れるにしても例えば全ビットoffなら255個の連結したBINARY型データをどう記述するのか分かりません。
文字列として記述不可能だと思うのですがどうすればいいのでしょうか?

それとももっと効率が良いとか、一般的な手段があるのでしょうか?

よろしくお願いします。
827ビギナー君:2010/12/13(月) 23:08:48 ID:???
なお、明日も仕事が早いので寝ないといけないのでアドバイス頂いても返事は遅れてしまうと思いますがお許しください。
828NAME IS NULL:2010/12/13(月) 23:26:02 ID:???
単に他のレコードと重複しないユニークな数値で良いなら
insert 時に自動的に連番を振る AUTO_INCREMENT という機能があるが
これでは駄目かな?
829NAME IS NULL:2010/12/13(月) 23:37:57 ID:???
ビギナーなのになぜわざわざわかりにくい方法をとるのか
830NAME IS NULL:2010/12/14(火) 00:42:13 ID:???
codezineていうサイトでphpのプログラム例を読んでいたのですが、
mysqlを使った例題で、レコード同士の紐付けに関して

ttp://codezine.jp/article/detail/3908?p=2

に説明が書いてはあるのですが、読んでいても理解できないので
どなたか教えて下さい。

お願いします。
831NAME IS NULL:2010/12/14(火) 00:47:45 ID:???
読むのマンドクセお前ら要約しろって事ですね、わかります
832NAME IS NULL:2010/12/14(火) 01:03:58 ID:???
ち、違います。誤解です。
質問の仕方が悪かったですね。
単純に紐付けの仕方と、aテーブルの1つのレコードに
bテーブルの複数の紐付く場合の、紐付け方と
読み出し方を教えて下さい。
833NAME IS NULL:2010/12/14(火) 01:08:02 ID:???
眠くて全く頭が働いてないけどForeign Keyとかの話なのかな
834832:2010/12/14(火) 01:11:43 ID:???
X  単純に紐付けの仕方と、aテーブルの1つのレコードに
○ aテーブルの1つのレコードに
にです。

お願いします。
835NAME IS NULL:2010/12/14(火) 01:30:18 ID:???
リンク先の文字を読む気力がないので記憶だけで解説してみる
見当違いな解説してたらごめん。

aテーブル
ID name
1 上条当麻
2 御坂美琴

bテーブル
ID fruit
1 リンゴ
2 バナナ
3 キウイ

上条当麻はリンゴとバナナが好きで
御坂美琴はリンゴとキウイが好きというをテーブルにしてみる
cテーブル
id_a id_b
1 1
1 2
2 1
2 3

テーブルを連結するにはJOIN構文を使う
SELECT id_a,fruit FROM c LEFT JOIN b ON id_b=b.id
これで
id_a frout
1 リンゴ
1 バナナ
2 リンゴ
2 キウイ
ってテーブルが得られるはず。
この辺はmany-to-manyとかone-to-manyで検索したら山ほど出てくるから
ググってみてくれ
836NAME IS NULL:2010/12/14(火) 07:50:46 ID:???
なんでmysqlのストアドにグローバル宣言と
inとoutないの?

糞過ぎる
837NAME IS NULL:2010/12/14(火) 08:26:00 ID:???
811=836
838NAME IS NULL:2010/12/14(火) 09:19:17 ID:tjmO7ufL
既存のDB設計を解析しております。
キャンペーンとしてテーブルがあり、「開始日(date)」と「終了日(date)」のカラムがあり、
「開始日」と「終了日」にプライマリキーが持たせてありました。
何かメリットはあるのでしょうか。

ER図を書く時にデータベースからリバースエンジニアリングしているのですが、正直この2個のカラムにプライマリキーはいらないんじゃないかと思います。
839NAME IS NULL:2010/12/14(火) 09:30:28 ID:???
開始日が同じで終了日が異なるキャンペーンがあるんだろ。
840NAME IS NULL:2010/12/14(火) 09:41:40 ID:tjmO7ufL
>>839
となると、ER図にする場合は必要ないということですよね。
プライマリキーは他のテーブルと結合するために必要なキーだと認識しておりますが、
開始日・終了日みたいに結合する項目がない場合は外してもいいのでしょうか。
841NAME IS NULL:2010/12/14(火) 10:09:50 ID:???
キャンペーンテーブルの内容と使用状況が判然としませんので、勝手な思い込みで書きます。

[ 開始日+終了日 ] でプライマリーキーとすることで、index を作成する意図があるのかもしれません。

テーブルの使用状況として、開始日と終了日を組み合わせての検索が多いのであれば、そうした意図を含めてテーブルを作成する方も世の中に居たりします。

ER図にする上では、注目することではないとも考えられます。
842NAME IS NULL:2010/12/14(火) 10:10:44 ID:tjmO7ufL
>>841
恐らく仰る通りだと思います。
ありがとうございます。
843NAME IS NULL:2010/12/14(火) 11:17:44 ID:???
プライマリキーの場合開始日と終了日にはNULLは許されないという制約を忘れるとまずいよ。
844NAME IS NULL:2010/12/14(火) 12:11:35 ID:???
>>843 ( ´∀`)bグッ!
845NAME IS NULL:2010/12/14(火) 18:16:32 ID:???
インデックス張るべきかどうかの判断指針ってありますか?
846NAME IS NULL:2010/12/14(火) 19:42:17 ID:???
カーディナリティが高いかどうかとか
847NAME IS NULL:2010/12/14(火) 20:16:57 ID:???
検索が遅ければ貼る
848ビギナー君:2010/12/14(火) 23:09:24 ID:???
>>828

アドバイス有難うございます。
自分が付けてるIDは数字ではなく、独自形式なのと、
何度も何度もデータの追加、削除を限られた総量の中で繰り返す事を想定しているため、
削除したものの再利用が出来ない手段は取れません。

やはりIDの最後尾をどこかに保存しつつ、削除した時は削除済みID貯めこみ用のテーブルを作り、
そのテーブルで再利用出来るものが無かった時に再び最後尾から採番していくのが良さそうかなと思いました。

削除する時も他のデータの参照IDとして使われてないかチェックしないと中身のすり変わりが起こりますしね。
849NAME IS NULL:2010/12/14(火) 23:23:45 ID:???
・プログラム起動時に、IDの最大値を取得する
・テーブルに削除フラグフィールドを追加する(indexも)
・情報の削除時、レコード削除ではなく削除フラグを立てる
・情報の追加時、削除フラグが立っているレコードを検索して存在すればそれを update
 削除フラグが立っているレコードが存在しなければ、最大値の次の値を振って insert、最大値更新
850NAME IS NULL:2010/12/16(木) 20:57:54 ID:3NO7AVhu
インデックスマージって、どの程度効果があるものでしょうか。
個人的には、過度な期待は禁物な機能だと思っているのですが。
(複数カラムで1つのインデックスを張ったほうがずっといい)

感覚的ですみません。
851NAME IS NULL:2010/12/17(金) 00:07:19 ID:???
852NAME IS NULL:2010/12/17(金) 01:53:04 ID:???
漢のコンピュータ道の開設間待ち
853NAME IS NULL:2010/12/17(金) 04:50:38 ID:???
>>850
感覚的にはそれでいいと思う
Oracleでも速くなった経験がない>インデックスマージ
854NAME IS NULL:2010/12/17(金) 21:12:26 ID:???
varcharとtextの違いってなんですか?
両方とも最大格納文字数って65535ですよね?
855NAME IS NULL:2010/12/17(金) 21:55:28 ID:???
856NAME IS NULL:2010/12/17(金) 23:26:49 ID:Uu3BKaZa
>>853
Oracleにインデックスマージの機能ってあったっけ?
857NAME IS NULL:2010/12/19(日) 17:57:55 ID:/aTRiTPD
LOAD DATA LOCAL INFILEでロードする場合、
入力ファイルは一旦クライアントからサーバに転送されてから
DBにロードされるのでしょうか。
だとすると、サーバには入力ファイルが転送できる分のディスク空き容量が必要なのでしょうか。


858NAME IS NULL:2010/12/19(日) 18:26:59 ID:???
>>857

> LOAD DATA LOCAL INFILEでロードする場合

クライアント側からの実行ですか?
サーバー上での実行ですか?
859NAME IS NULL:2010/12/19(日) 22:15:27 ID:TTyRkooc
DBのテーブル設計についてアドバイスをください。(長文失礼します)

SNSもどきのサイトを作っているのですが、
自分のマイページにお気に入りユーザーの行動を逐一通知する機能を作ろうと考えています。

例えば、お気に入りユーザーが「日記を書いた」「写真をアップした」「他の日記にコメントをつけた」等の
行動をとった場合に、自分のマイページに行動履歴が表示されるようにしたいのです。

その際、行動履歴のデータはどのように取得すべきなのでしょうか?


単純に、マイページを表示する度に必要な情報を各テーブルから取得れば実装は可能です。
具体的には、
全てのお気に入りユーザーについて
entryテーブル、pictureテーブル、commentテーブル、等、ユーザーのアクションに関連するテーブルから
データを引っ張ってきて新着順に表示する感じです。
ただ、お気に入りユーザーが増えたら物凄く重い処理になりそうです。。

もう一つの案としては、
行動履歴用のテーブルを別に用意して、
ユーザーが何かしらのアクションを起こした時に、本来のテーブルとは別に
行動履歴用のテーブルにもデータを保存するようにすれば
マイページを表示する際には一つのテーブルから検索するだけでよくなるので良さそうです。

どちらの方法が一般的なのでしょうか?
また違う方法あるのでしょうか?
facebookなどにもある機能なので理想的な実装方法がありそうなのですが
ネットで調べてもなかなか見つかりませんでした。
860NAME IS NULL:2010/12/19(日) 22:16:45 ID:/aTRiTPD
>>858
クライアント側からです。
861NAME IS NULL:2010/12/20(月) 04:36:12 ID:???
DB分散を始めてみようと思っています。
どのDBサーバにどれくらい負荷がかかっているかを
モニタリングするような仕組みはありますか?

WindowsのタスクマネージャーのCPU利用率みたいなグラフだとなお良いです。
862NAME IS NULL:2010/12/20(月) 05:26:58 ID:???
>>859
自分なら後者。
おそらく大量のinsertがあるだろうから当然innodbで。
863NAME IS NULL:2010/12/20(月) 11:16:02 ID:8JXmBtVW
>>860

マニュアルを読み返してください。

サーバー側からの実行とクライアント側からの実行についての注意点が書かれています。

864NAME IS NULL:2010/12/20(月) 21:21:10 ID:???
Download MySQL Community Server
http://dev.mysql.com/downloads/mysql/
で、5.1系列がないんですけど、5.1系列はもうダウン出来ないってこと?
865NAME IS NULL:2010/12/20(月) 22:28:14 ID:???
>>864
Looking for previous GA versions?をクリック
866NAME IS NULL:2010/12/20(月) 22:39:39 ID:???
>>865
ありがとうです。5.1.54が見つかりました
867NAME IS NULL:2010/12/22(水) 12:12:11 ID:???
INSERTがある日突然遅くなった(数msだったのが数十秒に)んだけど
どんな可能性があるでしょうか。

状況としては
・INSERT ... ON DUPLICATE KEY UPDATEを使っている
・SELECTを使ったINSERTではない
・特定のテーブルへのINSERTだけが遅い
・そのテーブルをロックするクエリなんて無い
・トランザクションの途中なのに重い
 (commitで時間がかかるほうがまだ理解できる)

自分の知識で思いつく範囲では、ロックされてるとしか思えないので
やっぱりどっかでロックしてるのかなぁと思うのですが。
868NAME IS NULL:2010/12/22(水) 12:24:28 ID:???
インデックスがいっぱい貼ってあるとか
mysqlcheckしてみるとか
869NAME IS NULL:2010/12/22(水) 12:48:37 ID:???
インデックスは単項目のが3つあるけど
INSERTとはいえ事実上はUPDATEで、どのインデックス項目も更新しない
というときでも遅い…。
データもたかが4万行程度。

mysqlcheckは知らなかったのでちょっと調べてみます。
870NAME IS NULL:2010/12/22(水) 14:43:57 ID:J74ILn00
レプリケーションを組んで、Master1台とSlave1台で運用しています。

この構成だと、Masterでハードウェア障害が発生しても、
Slaveに引き継ぐことで、可用性を確保できると思いますが、
例えば、Masterに間違って(又は悪意で)データをDROPした場合に、
DROP直前までのデータに戻すことが困難です。

フルバックアップファイルと、Masterのバイナリーログから復旧させると時間が掛かりますが、
出来れば、週一でフルバックアップ、それ以降は差分ログとして取得する方法を考えています。

Masterを停止させてフルバックアップさせるのが一番簡易ですが、
Masterを出来れば停止させずに、Slaveだけで実行できる方法はございますか?

SlaveでSTOP SLAVEをしてからフルバックアップしても、バックアップ後の差分ログが取得する方法が分からないので、
困っています。良い方法があればご教示下さい。

宜しくお願いします。
871NAME IS NULL:2010/12/22(水) 15:25:34 ID:???
>>867
ふつうにハード障害を疑っちゃうなあ
872NAME IS NULL:2010/12/22(水) 16:26:17 ID:???
>>867
他のテーブルがどうなってるかわからんが、インデックスの総量がメモリに収まらなくなってディスクアクセスが発生しちゃってるとか
メモリは十分に積んでるけど設定で使い切れてないとか
873NAME IS NULL:2010/12/22(水) 20:42:47 ID:???
874NAME IS NULL:2010/12/23(木) 16:25:26 ID:???
5.5になって、パフォーマンスが大幅に改善したらしいけど、
実際に使っていて、変わったっていう人いますか?

実際にどうなのかを聞いてみたい。
875NAME IS NULL:2010/12/23(木) 17:17:21 ID:???
互換性がメタメタ
876NAME IS NULL:2010/12/23(木) 18:23:01 ID:YZc0Oqr1
バックアップの考え方について教えてください。

バックアップ方法として、mysqldumpを忌み嫌う人が多いのは何故でしょうか?
データが膨大になると致命的になるのですか?

うちの会社のサービスはDBの総データ量がまだ10GB程度なので
フルでバックアップとっても数分で終わります。
その間は確かに接続が困難になるのですが、週1で深夜3時とかなので問題ないと思っています。

ここら辺の考え方は間違っているのでしょうか?
会社にWebサービスのノウハウが無いため一般常識が欠落していそうで少し怖いのです。
877NAME IS NULL:2010/12/23(木) 18:39:39 ID:???
>>876
大きな誤解があると思うけど、mysqldumpだと論理バックアップが取れるだけ。
だから、リカバリーしようとした時に、リカバリが正常に出来ない場合が多々発生する。
mysqldumpは緊急用であって、業務で使うのは論外。
878NAME IS NULL:2010/12/23(木) 18:48:32 ID:???
何かの原因でDBが異常をきたした場合って
他のバックアップ方法でも影響を受けるように思うけど
>>877が業務で使ってる方法は何なの?
879NAME IS NULL:2010/12/23(木) 18:55:39 ID:???
>その間は確かに接続が困難になるのですが、週1で深夜3時とかなので問題ないと思っています。
880NAME IS NULL:2010/12/23(木) 19:08:33 ID:???
mysqldumpしている間は、接続が困難になるって、
そもそも何?

接続が困難じゃなくて、単に落ちているってことでしょ。
サーバー落とすような運用がそもそもどうかと思うけど。
881NAME IS NULL:2010/12/23(木) 19:10:10 ID:???
みなさんは保存ドライブに、もうSSDは使ってますか?
SSDだと実質オンメモリDBに近い代物になると考えて良いのかな。

今は、安価なMLCタイプでも総書き込み数700テラ持つとかで、
寿命的には100年かけても使い切るの無理レベルだし
そろそろ検討しても良いのかな、と思いまして。
882NAME IS NULL:2010/12/23(木) 19:31:43 ID:???
SSDを使うことを検討するような高負荷のサイトなら、
いっそうClusterを使った方がスケールアウトがしやすいし、
速度も圧倒的に速いでしょ?
883881:2010/12/23(木) 20:53:47 ID:???
>>882
なるほど。 つまりSSDではレスポンスの改善は期待できないということでしょうか?
884NAME IS NULL:2010/12/23(木) 21:11:14 ID:???
期待できないことないけど、実効の転送速度がSASと余り変わらない。
それに、SASに比べてSSDの信頼性は格段に低いから、そもそもサーバー向きじゃない。


それなら、まずRAID0+1で4台くらい並列でやってみることが先で、
それでも限界ならClusterかもね。
885NAME IS NULL:2010/12/23(木) 22:02:38 ID:???
SSDの評価で転送速度て。本当に分かってんのかね
886NAME IS NULL:2010/12/23(木) 23:12:33 ID:???
>>884
お前がとんでもないシッタカってことは理解してあげた。口から出まかせ
撒き散らされると迷惑だから、もう二度と湧いてこないこと。
887NAME IS NULL:2010/12/23(木) 23:16:18 ID:???
>>876
リストアが遅い
一度リストアのテストしといたほうがいいよ
888NAME IS NULL:2010/12/24(金) 11:10:43 ID:CmCii1Ay
記事が著者、カテゴリ、タグとそれぞれ多対多の関係になる場合次のどっちが使いやすい、パフォーマンスがいい、ですか(検索など)?
記事の分類が増えることはなく、著者はただの分類でログイン等は持ちません。

記事: id, body
著者: id, name
カテゴリ: id, name
タグ:id, name
著者関係: 著者id, 記事id
カテゴリ関係: カテゴリid, 記事id
タグ関係: タグid, 記事id

記事: id, body
taxo: id, name, type
taxo関係: taxoid, 記事id
※taxo.typeは著者、カテゴリ、タグのいずれか
889NAME IS NULL:2010/12/24(金) 14:24:59 ID:???
その著者名とか分類とかタグに別のフィールド
(たとえば分類コード)があって、そのフィールドも検索対象になるなら
そういうテーブル構造がいいんだろうけど、
名称だけしか必要ない(twitterのハッシュタグみたいな)んだったら
記事: id, body
著者: id, 記事_id, name
カテゴリ: id, 記事_id, name
タグ: id, 記事_id, name
でいいんじゃねえかなぁと思う昨今
890NAME IS NULL:2010/12/24(金) 16:33:47 ID:???
891NAME IS NULL:2010/12/24(金) 18:04:13 ID:???
>>889
その手もアリですね

>>890
了解です
892NAME IS NULL:2010/12/26(日) 22:02:16 ID:???
5.1 <-> 5.5 の比較ってここでもないのねん
893NAME IS NULL:2010/12/29(水) 23:15:50 ID:1wfFybCd
5.5のインストール方法教えてほしい。
今までみたいに./configure使わなくなってない??
codeからMacにinstallしたいんだけど、どうしたらいい??
894NAME IS NULL:2010/12/29(水) 23:25:48 ID:???
>>893
ソースを展開したこともないけど、INSTALLとかREADMEってファイルもないん?
895NAME IS NULL:2010/12/30(木) 03:17:01 ID:???
>>893
うん。configureじゃなくなったようだ。
自分はどうやったっけな。インストールスクリプトがあったような。それはバイナリの場合か。
896NAME IS NULL:2011/01/01(土) 20:40:20 ID:???
897NAME IS NULL:2011/01/02(日) 16:13:27 ID:GQVFH3+l
ベスト曲のアンケートの投票をしてもらい
その結果の集計を行いたいのです

その際、曲名(name)毎に最新のcommentを
取得したいのです。(comment付の中での最新)

[song]
id name
1 biginner
2 ヘビーローテーション
3 ポニーテールとシュシュ

[vote]
guid id pt update comment
xxxxxx 1 3 2011-01-01 00:01 最高!
xxxxxx 2 2 2011-01-01 00:05
xxxxxx 3 1 2011-01-01 00:09 いい!
yyyyyy 1 3 2010-12-31 23:59
zzzzzz 2 3 2010-12-31 22:22 好き

guid---個体識別番号

[求めたい結果]
id name SUM(pt) comment
1 biginner 6 最高!
2 ヘビーローテーション 5 好き
3 ポニーテールとシュシュ 1 いい!

SELECT id, name, SUM(pt), comment
FROM vote JOIN song USING(id)
GROUP BY id

得点の集計までは出来ましたが
最新commentの取得が上手く行きません

どうすれば上手く行きますでしょうか?
898NAME IS NULL:2011/01/02(日) 16:40:01 ID:???
>>897
それって、comment は一意に決まる?
899NAME IS NULL:2011/01/02(日) 17:14:13 ID:GQVFH3+l
>>898
uniqueではないです。。。
ユーザー投稿なので自由にコメント出来ます。
900NAME IS NULL:2011/01/02(日) 17:25:04 ID:???
>>899
それだと、例えば↓のとき、comment が決まらなくない?

guid id pt update comment
xxxxxx 1 3 2011-01-01 00:01 最高!
xxxxxx 1 1 2011-01-01 00:01 やっぱりダメ
901NAME IS NULL:2011/01/02(日) 18:16:21 ID:???
voteテーブルに通し番号付ければいいだけでねーの?
902NAME IS NULL:2011/01/02(日) 20:01:47 ID:GQVFH3+l
>>900
確かにその通りでした。

>>901
通し番号付ければ>>897は可能ですか?
903NAME IS NULL:2011/01/02(日) 20:06:11 ID:???
通し番号があれば最新の、というか最後の投稿だけ拾う事は可能だな
904NAME IS NULL:2011/01/02(日) 21:56:00 ID:???
>>902
タイムスタンプ関係なく、追加するオートインクリメント行の最大値が最新じゃん
905NAME IS NULL:2011/01/03(月) 11:26:57 ID:AhcXKhDT
>>903-904
ありがとうございます。
どのような文になりますか?
906NAME IS NULL:2011/01/03(月) 11:40:51 ID:???
少しは自分で考えろよ。
907NAME IS NULL:2011/01/03(月) 13:40:34 ID:???
連番なくても平気じゃね?

voteのidとupdateをキーに最新ポイント付与日時が抜ける。

FROM句に、テーブルsongと、voteをinner joinしてgroup by id,nameしたものを置き、
SELECT句で、id,name,ptのsumaryをそのまま表示。
commentは、SELECT句で相関サブクエリにて引っこ抜けばよい。
908NAME IS NULL:2011/01/03(月) 16:56:04 ID:???
助けて下さい!
XAMPPのMySQLadminを使って小数点のカラムを追加したいんですがうまくいきません>_<
作りたいのは整数部7桁、小数部2桁の(7,2)カラムです
データ型をflowt、doubleどちらにしても構文エラーでした
SQLのクエリー式ご存知の方いたら教えて下さいm(__)m
ググっても自分だけの現象みたいなんです
909NAME IS NULL:2011/01/03(月) 17:03:20 ID:???
お前はどう書いたんだよ
ちなみにテーブル操作はクエリ式じゃなくてDDLな
910NAME IS NULL:2011/01/03(月) 18:13:51 ID:???
公式のマニュアルと言うのがあってだな・・・
http://dev.mysql.com/doc/refman/4.1/ja/numeric-types.html
911NAME IS NULL:2011/01/03(月) 18:47:02 ID:???
>>909
どう書いたも何もテーブルの項目追加ページで
データ型「double」、長さ「7,2」で追加しようとしただけです

>>910
マニュアルありがとうございます!
これでクエリー式調べてみます!
912NAME IS NULL:2011/01/04(火) 00:01:39 ID:???
5.5.8入れてみた
なんか色々と廃止になったオプションがあって削るのに苦労したわ…
913NAME IS NULL:2011/01/04(火) 07:06:40 ID:1v2YMLI4
> テーブルの項目追加ページで

わ〜くべんち にふんぞりかえってすわってるのかな?w
914NAME IS NULL:2011/01/04(火) 08:01:08 ID:???
5.0.88で、limitを使ってます。

select * from tbl where xxxx like 'xxxx' limit 6,8
のような使い方をしていますが、このsqlで6行取れてしまいます。

limit 1,3 では3行ですが、limit 0,2では2行で、limit 7,9では5行取れてしまいます。

スタート位置は正しいのですが、終わり側が不安定です。

これは、何が悪いのでしょうか?
似た事例等は、あるのでしょうか?
915NAME IS NULL:2011/01/04(火) 08:34:21 ID:???
>>914

[MySQL] 検索結果の%a行目から%b件を取得
SELECT * FROM sample LIMIT %a, %b;

> select * from tbl where xxxx like 'xxxx' limit 6,8
> のような使い方をしていますが、このsqlで6行取れてしまいます。
6行目から8件を取得

> limit 1,3 では3行ですが
1行目から3件を取得

> limit 0,2では2行で
先頭から2件を取得

> limit 7,9では5行取れてしまいます。
7件目から9件を取得

ちなみに select count(*) from tbl where xxxx like 'xxxx' を実行すると何件と表示されますか?
916NAME IS NULL:2011/01/04(火) 08:36:09 ID:???
>>914
その結果は正しく安定してます。 第2引数は、取得したい「行数」です
917915:2011/01/04(火) 11:10:44 ID:???
私が悪ぅ御座いましたorz

レスくれた方有難う御座いました。

2つめに、終わりの行番号を指定していましたが、
ここは、取得したい行数の指定でした。
918NAME IS NULL:2011/01/04(火) 18:13:32 ID:FE7Ji5jL
AとBと言うカラムがあって、Bで並び替えた後にAでグルーピングすることは可能でしょうか?
例えば
A   B
東京  140
東京  190
大阪  150

これを
select * from table group by A
とすると
A   B
東京  140
大阪  150
が抽出されます。

でも抽出したいデータは
A   B
東京  190
大阪  150
なのです。よろしくお願いします。
919NAME IS NULL:2011/01/04(火) 19:04:43 ID:1v2YMLI4
>>918

> でも抽出したいデータは

抽出したいデータの考え方がわかりません。

> 東京  140
> 東京  190

なぜ、東京/140 ではなく、東京/190 を取り出したいのですか?
カラムBにて、値の大きな方を取り出したいのですか?
920NAME IS NULL:2011/01/04(火) 19:32:22 ID:FE7Ji5jL
>>919
そうです。値の大きな方を取り出したいです。
言葉足らずですみません。
921NAME IS NULL:2011/01/04(火) 20:03:58 ID:???
select A,MAX(B) from table group by A

GROUP BY句で指定したカラム以外は、集約関数で括らないといけない。
922NAME IS NULL:2011/01/06(木) 00:52:50 ID:VZgxKF6e
>>907
相関サブクエリで調べて色々試してみたところ
何かと動きました。

SELECT id, name, SUM(pt), (
 SELECT comment
 FROM vote v2
 WHERE v1.id = v2.id
 AND v2.update = (
  SELECT MAX(update)
  FROM vote v3
  WHERE v2.id = v3.id
  AND comment<>'')
 )
FROM vote v1
JOIN song USING(id)
GROUP BY id, name
ORDER BY SUM(pt) DESC

ありがとうございました。
合ってるのかどうか分かりませんが…。
923NAME IS NULL:2011/01/06(木) 03:36:01 ID:7315SOVM
MySQL 5.087(Tritonn最新版)を使ってます。
割と長いあいだ運用した後、SSL接続する必要が出てきて調べたのだけど、
Open SSL接続するには ./configure するときに --with-openssl として
組み込んでおかないとダメと知りました。

今から入れ直すのは出来れば避けたいのですが、
後から入れるのは無理ですかね?
924NAME IS NULL:2011/01/06(木) 14:41:17 ID:???
>>923
デフォルトでw/sslオプションが入ってない限り無理だと思う。
データダンプしておいてコンパイルしなおすしかないでしょう。
925NAME IS NULL:2011/01/06(木) 17:04:27 ID:???
>>923
この際MySQL5.5のプラグインによる日本語全文検索も検証してみては?!
926NAME IS NULL:2011/01/06(木) 19:55:08 ID:???
>>925
なんてやつ?気になる!
927923:2011/01/06(木) 23:35:51 ID:7315SOVM
>>924 >>925
んー。やっぱ総入れなおししかないかー。
innodbで楽に全文検索できるのってないですよね?
928NAME IS NULL:2011/01/07(金) 00:43:25 ID:???
>>927
そもそもsslの目的は?普通データベースはバックエンドだから、外部から直接アクセスも通信の中見ることもできないと思うけど。
もしWAN越しに直接データベース触るために、とかならvpnとかはどうだろう。

Tritonnは5.0で打ち止めだし、今後のことを考えれば5.5の検証をかねて総入れ替えもいいのでは。grooongaが安定してくれるといいんだけど。
929NAME IS NULL:2011/01/07(金) 01:33:49 ID:???
>>928
VPSで複数契約して分散させたい、というのが理由です。
専用サーバなら考えることもないんだろうけど。
gronngaはまだ出たばかりですかね。
930NAME IS NULL:2011/01/07(金) 10:08:25 ID:???
where句で月別にデータを取得する方法を教えて下さい。

GROUP BY DATE_FORMAT(date, '%Y%m')みたいな方法は見つけたのですが、
where句で取りたいのです。
931NAME IS NULL:2011/01/07(金) 10:36:12 ID:???
>>930
where句でどうやりたいの?
日本語で書いてみて。
932NAME IS NULL:2011/01/07(金) 13:06:02 ID:???
select * from
hogehoge
where
year(日付カラム)= 2010
and
month(日付カラム)= 12;
みたいな?
933NAME IS NULL:2011/01/07(金) 13:52:45 ID:???
それはその月のデータだけを抽出してるのであって
「月別にデータを取得」ではない
934NAME IS NULL:2011/01/07(金) 14:44:53 ID:???
>>932
ダサい方法としては、そのまんま
WHERE DATE_FORMAT(date, '%Y%m')='201012'
かな。
935NAME IS NULL:2011/01/07(金) 17:21:15 ID:???
>>933
そうだった w
936NAME IS NULL:2011/01/07(金) 17:26:17 ID:???
WHERE EXTRACT(YEAR_MONTH FROM 日付カラム ) = 201012の方が良さそうだけど
いずれにしろ月別にデータを取得したければGROUP BYするしか無いんじゃね
937NAME IS NULL:2011/01/07(金) 18:25:03 ID:???
普通に不等号で比較するようにした方がいいね
検索対象を変換してちゃ速度はまったく稼げんよね
938NAME IS NULL:2011/01/07(金) 21:49:32 ID:???
変換関数使うとコーディングは便利だけどインデックス効きません
939NAME IS NULL:2011/01/08(土) 20:09:12 ID:???
ハイスコア表示したいのですが
scoreというintの中から
点数が高い方から10件取得とかってどうやればいいのでしょうか
940NAME IS NULL:2011/01/08(土) 21:12:31 ID:???
>>939
まずはSQLの基本でも勉強してから・・・
941939:2011/01/08(土) 22:28:59 ID:???
え?SQLのスレじゃないんですか?
942NAME IS NULL:2011/01/08(土) 22:49:29 ID:???
select score from table_name order by score desc limit 10;

こんな小学生でもわかりそうな回答書かせるなよ恥ずかしい
943NAME IS NULL:2011/01/09(日) 02:43:34 ID:K+3Mz0uI
すいません、質問してもいいでしょうか?
UNIXにMySQLいれたら
「information_schema」と、「mysql」と「test」ってDBが
元からあるのですが、これはどれも削除してはならないのでしょうか?
よろしくお願いします。m(___)m
944NAME IS NULL:2011/01/09(日) 03:28:49 ID:???
>>943
Test以外は必須かと。
945923:2011/01/09(日) 06:00:37 ID:pi9kCO25
結局with-opensslオプション入れてTritonn入れなおしたんですが、
mysql > show variables like '%ssl%';
すると最初は
| have_openssl | YES
| have_ssl | YES

になるのに、sslキーと証明書のパス(ssl_ca、ssl_cert、ssl_key)を
入れてMySQLを再起動すると両方 DISABLED になってしまう。

パスが間違ってるはずはないのですが、
何か考えられるミスはあるでしょうか?
946NAME IS NULL:2011/01/09(日) 13:00:18 ID:pjYtzcAO
あるレコードに関連する都道府県情報を格納するとき
・pref というカラムを作って、カンマ区切りの「,1,2,3,」(1=北海道,2=青森等)で格納
・pref_1 pref_2 pref_3... と都道府県毎にカラムを分けてbooleanで格納
・pref_lists というテーブルを作って、 id,pref_id と正規化
どれが一番現実的でしょうか?
947NAME IS NULL:2011/01/09(日) 14:26:51 ID:???
>>946

3回読み直したが、質問の意図が読み取れなかった。スマソ
948NAME IS NULL:2011/01/09(日) 16:04:18 ID:???
1番はなんか生理的にイヤ
2番はカラムが少ないならいいけど47カラムは多すぎる
3番が良さげ
949NAME IS NULL:2011/01/09(日) 16:35:55 ID:???
普通、3番なのでは?
950NAME IS NULL:2011/01/09(日) 16:47:02 ID:???
タプル数が10万単位だと、一番速いのは2番だよね?
951NAME IS NULL:2011/01/09(日) 17:02:40 ID:???
普通は3ですよ。 2でboolean使うなら、64ビットカラム1個作ってフラグ管理するとかもあるけど。
952NAME IS NULL:2011/01/09(日) 18:01:07 ID:???
普通は3番でも、>>946がやる3番は、何か違うものになりそうな気がする・・・
953NAME IS NULL:2011/01/10(月) 17:10:38 ID:???
>>944
実は必須ではないんだぜ。
954945:2011/01/11(火) 09:22:17 ID:hGqp7xTm
あー…解決しました。一応書いておきます。
パスじゃなくてファイルの権限ミスでした。そんなことだと思った…orz
ちゃんとmysqlのユーザーにしましょうってことで…。
chown mysql:mysql file.key でOkでした。
955NAME IS NULL:2011/01/11(火) 20:57:10 ID:9K/XG28C
レプリケーションについてご教示ください。

マスターで、テーブルAに対するLOAD DATAによる登録が完了した直後、
テーブルBに対して更新があったとします。
このとき、スレーブにテーブルBの更新が反映されるのは、
スレーブでのテーブルAの登録完了後になるのでしょうか。

スレーブで、テーブルA登録と並行してテーブルBが更新されることはない?

956NAME IS NULL:2011/01/11(火) 21:16:04 ID:???
>>955
詳しくはないがbinlog順なら並列はないんじゃないかな
957NAME IS NULL:2011/01/12(水) 23:07:21 ID:???
>>955
前の処理が完了してからだよー。
LOAD DATA とレプリケーションの組み合わせには癖があるから以下も参照推奨
http://dev.mysql.com/doc/refman/5.1/en/replication-features-load-data.html
958NAME IS NULL:2011/01/13(木) 11:22:48 ID:9diMavRW
MySQLをインストールしたら、phpMyAdminの「特権」タブを見ましたら、
ユーザ  ホスト  パスワード
すべて   %    --
すべて sql.localhost いいえ
すべて localhost   いいえ
root  127.0.0.1   いいえ
root  sql.localhost いいえ
root  localhost   はい
---------------
と6つのユーザがいるのですが、これはroot/localhost/パスワードあり
以外全部削除しても大丈夫なのでしょうか?
よろしくお願いします。m(__)m
959NAME IS NULL:2011/01/13(木) 11:54:33 ID:2nBK8W/w
Aテーブル
id
---
1
2
3

Bテーブル
id | a_id
----------
1 | 1
2 | 1
3 | 2

というテーブルで以下のような結果を受け取りたいのですが、可能でしょうか?
a.id | b.id
------------
1 | 1
1 | 2
2 | 3
3 | 0

普通に結合すると、Bテーブルに存在しない
a.id=3を出すことが出来ず悩んでいます。
960NAME IS NULL:2011/01/13(木) 11:57:37 ID:???
こういう時に left join 使えばいいんですね…。
961955:2011/01/13(木) 22:49:16 ID:NVXKU1p8
>>956
>>957
ありがとうございます・
1テーブルに大量件数LOAD DATAすると、
全テーブルのレプリケーションが遅延してしまうんですね。。。

962NAME IS NULL:2011/01/14(金) 11:04:06 ID:uJ5LUOx7
バッチで30個のテーブルに1万件ずつほどのデータを登録しようと思っています。
バッチで登録処理を行なっている間も他のプログラムからテーブルへの
参照が行われる事が考えられるのでトランザクションを貼ろうと考えていますが、
beginをバッチの開始直後,commitをバッチの終了時に行うと
凄くパフォーマンスが悪いように思えます。
テーブル単位でトランザクションを貼ると、
他のプログラムから参照を行ったときに
テーブル間のデータの不整合が発生することが考えられるのですが、
みなさんはこういう場合はどの様に設計されますか?
963NAME IS NULL:2011/01/14(金) 11:57:14 ID:???
>>962

> バッチで登録処理を行なっている間も他のプログラムからテーブルへの
> 参照が行われる事が考えられるのでトランザクションを貼ろうと考えていますが、

参照が行われるからトランザクションを使う?
その発想にいたる背景がわからないので答え難い。

安易にバッチ処理での登録と考える前に、
登録処理中にテーブル参照されることで発生する不都合が何かを考慮してから、
データ登録の方法を考えるべきだと思います。
964962:2011/01/14(金) 14:11:23 ID:???
>>963

言葉足らずで申し訳ありません。

テーブルを参照するプログラムは
データの集計を行うプログラムになります。
Aというテーブルではバッチからの更新が終了しているけれど
Bというテーブルではまだバッチで更新中となっている場合
HOGEというプログラムが両方のテーブルの情報を集計するとなると
テーブル間の不整合が発生するのでトランザクションを使用しています。

そして今回はバッチで登録・更新をするテーブルの数が多いので
>>962にあるような質問をさせていただきました。
965NAME IS NULL:2011/01/14(金) 14:59:43 ID:???
HOGE というプログラムが、テーブルAとテーブルBを参照するんですね?
そのHOGEというプログラムが、テーブルAとテーブルBに登録処理をしている最中でも稼動するんですね?

HOGE というプログラムがシステムの中で重要度が高いのであれば…

テーブルAとテーブルBにデータを登録する際には、HOGEというプログラムを考慮して、
テーブルAとBへのデータ登録は両テーブルの整合性が取れている状態として1件ごとに処理をする。

そんな方法を検討する可能性も有ります。

述べられている「参照するプログラム」が出力する結果が、そのシステムでどれだけ重要であるかを考慮する必要があります。

逆の意味で述べれば、テーブル更新が終了する前に、システムとして重要な出力結果を出すHOGEを実行しない、これが適切だとも言えます。
966NAME IS NULL:2011/01/14(金) 15:04:48 ID:???
初歩的な質問ですが探してもわからなかったので質問します
MySQL5.1をInnoDB Pluginで使っていますが、
1つのテーブルのカラム数は大体このくらいまでにしておいた方が良い、ってのはありますか?
扱うデータが多くて、素直に組むとカラム数が200ぐらいになるのですが
これが1億レコードぐらいになると、パフォーマンスに結構影響しますか?
経験がなくてわからないので、皆さんの意見を聞きたいです
967NAME IS NULL:2011/01/14(金) 15:33:55 ID:???
>>966
InnoDBは8KBのレコード長制限がある。
VARCHAR、TEXTなど長いカラムはページ外に保存されるのだけど、
200カラムは作れない可能性が高いので事前に確認しないとだめ
作れるなら性能はそんなに気にしなくてもよい
968NAME IS NULL:2011/01/14(金) 20:46:10 ID:???
>>964
別にバッチ処理中か確認するようにすれば?
別テーブルにフラグみたいなもん立てるとか。
969NAME IS NULL:2011/01/15(土) 15:13:56 ID:???
素直にトランザクションで解決してなにが悪いのかワカラン。
コミットに時間がかかってもバッチ処理なら問題ないだろうし。
970NAME IS NULL:2011/01/15(土) 22:10:40 ID:???
ユーザー作成時に

CREATE USER <ユーザ名> IDENTIFIED BY '<パスワード>';

この時に同時に権限を設定するという事は出来ないのですか?これはあくまでもユーザーを作成するだけで
権限付与は従来からのgrant文でということ?
971NAME IS NULL:2011/01/16(日) 00:53:13 ID:???
役立たずの古い技術者です。

バッチプログラムからデータベースのデータ処理をするときに、
カーソルを使って、1件ずつ読みだして処理する。。
という、昔ながらの手法があります。

MySQLで同じような処理を行おうと思いましたが、
カーソルに対応していないことを知りました。

カーソルのフェッチに相当する処理をCライブラリで
実現しようと考えていますが、結果セットを取得するAPIでは
処理実現が厳しいかな?と考えています。

Mysql_store_result()は結果セットをローカルに保存するので、
結果が大量になったとき、メモリ不足が発生しそうで、
枕を高くして眠れません。

Mysql_use_result()は1件読み出しが実現できますが、
対象のテーブルがロックされるとマニュアルに記載があります。
検索範囲や分離レベルによらずに、です。
これでは、バッチ処理が終わるまで他の処理が継続できなくなります。

あとは、mysql_stmt系のサーバ再度カーソルがあるようですが、
サーバ側のメモリを大量消費&閾値こえるとMyISAMにデータコピーする
仕様になっており、ちょっと手を出すのをためらわれます。

MySQLで大量データを保管するテーブルで、バッチで範囲指定(これも大量にヒットする)
してデータ抽出し処理したい場合、どういう処理をしているのでしょうか?


972NAME IS NULL:2011/01/16(日) 01:10:49 ID:???
範囲指定をsqlのselectで指定して
後はupdateするだけじゃね?
行指定ならlimit使うだけ
何がわからんの?
973NAME IS NULL:2011/01/16(日) 01:28:49 ID:???
>>971
サーバサイドのmysql_stmt_fetch()使うしかない気がする。
大きな結果セットでMyISAM使うとしても
それってOracleでORDER BY、GROUP BYなどによって一時テーブル使うのと
そんなに変わらない、といいね

>>972
LIMIT 0, 100
LIMIT 100, 100

というのは案としてあると思う。
けどACIDとるために最初にテーブルロックせざるをえない
974NAME IS NULL:2011/01/16(日) 02:00:34 ID:???
>>971

> カーソルを使って、1件ずつ読みだして処理する。。
> MySQLで同じような処理を行おうと思いましたが、
> カーソルに対応していないことを知りました。

あなたの言われている「カーソルに対応していない」とは、何を指しているのか理解できません。

975NAME IS NULL:2011/01/16(日) 02:17:05 ID:???
>>974
カーソル知らないの?
1行ずつフェッチして、更新したりできるんだよ、大量データを逐次処理できるの
976NAME IS NULL:2011/01/16(日) 03:41:36 ID:???
> カーソルに対応していない

カーソルは知っているけれども、対応していないが漠然としているのでは?
977NAME IS NULL:2011/01/16(日) 11:06:21 ID:P3g9vKaN
>>971
>カーソルに対応していないことを知りました。


あなたの使ってるMySQLはカーソルに対応していない
だろ。正確に書いてよ
978NAME IS NULL:2011/01/16(日) 12:47:41 ID:???
>>971
カーソルに対応しているmysqlがあるとでも?
979NAME IS NULL:2011/01/16(日) 15:01:37 ID:???
980NAME IS NULL:2011/01/16(日) 17:29:08 ID:???
>>979
それ、ストアドだって。
もともと、Cライブラリでカーソルとかいうことじゃね?
981NAME IS NULL:2011/01/16(日) 19:46:45 ID:???
問題は、MySQLの通信プロトコル上、非prepare系のAPIでは
SQLを実行した瞬間に結果の全件がクライアントに送られるところ。
MySQLのカーソル操作はクライアント上でエミュレーションしているに過ぎない。
だからSELECT結果が5GBとかに達する場合、クライアントが32bitだと処理できない。

他のRDBMSでは「次のレコードをよこせ」というリクエストを送って
数十レコードごと逐次結果が返されるようになっている。

mysql_stmt_prepare()系は逐次レコードを返すはずだけど
そもそもMySQLでそういうバッチ処理を書く人があまりいないので
ノウハウが少ない。
982NAME IS NULL:2011/01/17(月) 10:30:41 ID:???
ウェブ系以外でMySQLよりPostgreSQLが使われるケースが多い理由のひとつ。
983962:2011/01/17(月) 10:58:33 ID:???
>>965
レスありがとうございます。
>HOGE というプログラムが、テーブルAとテーブルBを参照するんですね?
そうです。
>そのHOGEというプログラムが、テーブルAとテーブルBに登録処理をしている最中でも稼動するんですね?
そうです。

>テーブル更新が終了する前に、システムとして重要な出力結果を出すHOGEを実行しない、これが適切だとも言えます。
こちらの方法を検討してみようかと思っています。
ただ、バッチは30分近くかかりそうなので、
その間HOGEが実行されないのが業務用件的にNGになりそうな気配もあります。


>>968
ありがとうございます。
その方向で少し検討してみます。

>>969
大量のデータを登録・更新するときって
トランザクションをずーっと貼りつづけていると
すこぶるパフォーマンスが落ちることってありませんか?
あ、バックグラウンドのバッチだからそんなの気にしなくてもいいじゃないかって
ことでしょうか?
984NAME IS NULL:2011/01/17(月) 11:55:38 ID:???
>>983
> >>969
> 大量のデータを登録・更新するときって
> トランザクションをずーっと貼りつづけていると
> すこぶるパフォーマンスが落ちることってありませんか?

InnoDBのMVCCはそこまでアホな実装じゃない。
バッチだから仮に遅くても気にしなくていいってのはそう思うし。
985NAME IS NULL:2011/01/17(月) 22:53:41 ID:NkbyBHZG
レプリケーションで、スレーブで起動されるSQLスレッドの数は
1スレッドのみなんでしょうか?
986NAME IS NULL
1スレッドのみです