1 :
NAME IS NULL :
2010/06/11(金) 18:17:19 ID:CZ3w74oP
2 :
NAME IS NULL :2010/06/11(金) 18:17:30 ID:CZ3w74oP
3 :
NAME 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型を変換して結合する事は出来ないのでしょうか?
まずSELECT文で2010-06の形に表示できないでしょ君
6 :
NAME IS NULL :2010/06/13(日) 00:38:09 ID:n4WAyuno
ついにHPにオラクルのロゴが・・・ 健全なDBの発展にとって、障害にならないことを祈るよ。
SunだけじゃなくてHPもか。
8 :
NAME IS NULL :2010/06/13(日) 02:34:52 ID:LooQN1pa
MySQLはやはりこれから衰退するのかな?
9 :
NAME IS NULL :2010/06/13(日) 23:30:30 ID:6Ht8+KIJ
MySQL workbentchで複合キーを設定するにはどうすればよいのでしょうか?
複数のテーブルをJOINして抽出しています。 データ量が増えるほど抽出に時間がかかるようになりました。 JOINには各テーブルでPRIMARYに指定しているカラムで連結していますが、 このPRIMARYに指定しているカラムにもINDEXを作成した方がいいのでしょうか? phpMyAdminでそれを行うと、同じものだからどちらかを削除するように、 とワーニングが表示されます。
主キーには自動的にインデックスが作成される
12 :
NAME IS NULL :2010/06/14(月) 18:19:37 ID:zkQpRMhb
設計に関して相談です。 野球とかサッカーとかチーム名を保存するテーブルがあったとして、 それぞれの目的毎にテーブルを分けますか?それとも id | name | type | 1 巨人 野球 2 阪神 野球 3 ジュビロ サッカー みたいに、1つのテーブルでまとめますか? フィールドがジャンル毎に異なるので、今現時点では分けているのですが、 野球とかサッカーとかチーム名の場合、多くても100レコードほどなので 1つにまとめても良いのではないか?と思っています。 そこで皆さんはどうされているか気になる、質問させていただきました。
13 :
NAME IS NULL :2010/06/14(月) 18:24:22 ID:zkQpRMhb
最終行、間違っていました。「気になる → 気になり」です。 あと、要件として「各チームのファン(会員)」情報も登録させたいと思っています。 現在は、baseball_userとかsoccer_userとかそれぞれ会員テーブルを作って 会員情報を保存しているのですが、これもuserという一つのテーブルに まとめても良いんじゃないか?とも思っています。 どちらの方が管理しやすいか、先が見えないので悩んでいます。
「チーム名を」保存するテーブル、言ってみればチーム名マスタなんでしょ? なんでtypeなんてカラムがあるの? とか思ってしまう。 だからと言って、種目ごとにテーブル分けれって意味でもない。 例えば チーム名テーブル id | name 1 巨人 2 阪神 3 ジュビロ チーム:種目テーブル id|type 1 1 2 1 3 2 種目名テーブル id|name 1 野球 2 サッカー と、多分教科書通りならこうなる。 先々扱う種目が増えるたびにテーブル自体増やすって あんまりやりたくないし。
15 :
12 :2010/06/14(月) 19:35:32 ID:zkQpRMhb
>>14 ありがとうございます。typeに分けたのは
それほど種目の数が多く無いと思ったので。
一覧出力する時にJOINするよりも良いかな?って思いました。
では、種目毎の会員にしたい場合はどうするんでしょうか?
id|種目id|name|sex
1 1 aaa 男
2 1 bbb 女
3 2 aba 男
みたいに一つのテーブルにまとめる考え方で良いのでしょうか?
id|name|sex 1 aaa M 2 bbb F 3 aba M id|team-id 1 1 1 2 2 3 3 3
17 :
12 :2010/06/14(月) 20:55:11 ID:zkQpRMhb
>>16 すみません、後半が全く意味が分からないです。なぜこうしているのかが・・・
18 :
NAME 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にない列も登録できます なぜですか?
19 :
NAME 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 を無効にすることは可能なのでしょうか? クレクレで申し訳ないのですがお教えいただければ幸いです。
そのなかではiSCSIがいちばんあやしい
skip-external-lockingと、my.cnfに書けばよい。
22 :
NAME 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がアップグレードされていない? それとも他に原因があるのでしょうか? ご教授願います。
24 :
NAME 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
'%藤%'のSELECT結果を貼ってもらえれば 何か分かるかもしれない
26 :
NAME 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が上記の結果に含まれる" よろしくお願いします。
FROM=`mysql -u scott -pXXXXX scott -B -N -e 'select ename from emp where empno = 7788'` とか。 ただやりたいことを想像するに SELECT INTO OUTFILEとLOAD DATA LOCAL INFILEの方が 便利ではないかと思われます。
28 :
NAME IS NULL :2010/06/19(土) 12:44:20 ID:pO5pEHhw
>>25 回答いただきありがとうございます。
現在も同じ状況なので、引き続き質問させていただきます。
>'%藤%'のSELECT結果を貼ってもらえれば
>何か分かるかもしれない
参考になればと思い、いくつかパターンをはらせていただきました。
'%藤%'の出力結果
+--------+
name
+--------+
加藤二郎
内藤五郎
+--------+
'_藤%'&'?藤%'の出力結果の出力結果
'____'&'_%__'も同じ結果です。
Empty set
※
情報処理の教科書そのまま使っているのでDB全体は割合しますが、1郎〜5郎までは
苗字が違うだけです。
お時間がありましたらよろしくお願いします。
29 :
NAME IS NULL :2010/06/19(土) 12:46:11 ID:pO5pEHhw
>>25 回答いただきありがとうございます。
現在も同じ状況なので、引き続き質問させていただきます。
>'%藤%'のSELECT結果を貼ってもらえれば
>何か分かるかもしれない
参考になればと思い、いくつかパターンをはらせていただきました。
'%藤%'の出力結果
+--------+
name
+--------+
加藤二郎
内藤五郎
+--------+
'_藤%'&'?藤%'の出力結果の出力結果
'____'&'_%__'も同じ結果です。
Empty set
※
情報処理の教科書そのまま使っているのでDB全体は割合しますが、1郎〜5郎までは
苗字が違うだけです。
お時間がありましたらよろしくお願いします。
とりま、テーブルの文字コード指定も絡むから話が面倒だけど、 like '__藤%' だとどーなのよ
なるほど。そしたら __藤% ___藤% の処理結果と、 show create table testdb\G それから show session variables like '%char%'; の結果を貼ると親切な人が教えてくれるかもしれない
32 :
NAME IS NULL :2010/06/19(土) 13:44:17 ID:pO5pEHhw
>>30 でました!
半角英数は1文字=1バイトで、日本語は1文字=2バイト消費する。
だからアンダーバーを二つつける必要がある?という感じでしょうか…
あまりご迷惑はおかけできないので、テーブルの文字コード指定の件は
今から自分で調べてみます。
本っ当に助かりました。
ありがとうございます。
MySQL 4.1以降ではアンダーバーは一つで出るのが正しい そのままやってると何かするたびに意図どおりに動かなくて悩むぞ 今のうちに直そう
34 :
NAME IS NULL :2010/06/19(土) 14:09:10 ID:pO5pEHhw
>>33 もう一度確認しましたが、バージョンは5.1で間違いないんです;
おそらく文字コード指定があってないのではと考え、色々探しています。
とりあえず「一つで出るのが本当は正しい」というこれからも認識は残すようにします。
重ね重ね親切にありがとうございます。
35 :
NAME 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";
よろしくお願いします。
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
まちがえた 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
38 :
NAME IS NULL :2010/06/19(土) 17:08:13 ID:uc4dA5J7
>>37 ありがとうございました。
内部結合すると内部結合した結果が
ファイルに書き込まれてしまうものと思い、
サブクエリを使ってみていたのですが、
>SELECT ed.*
なるほどです!
39 :
NAME IS NULL :2010/06/19(土) 17:22:25 ID:+rTxija2
>>22 どなたか分かる方いましたら、お願いします。
40 :
NAME 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 →解決せず って状態なんだけどどーしたらいい?
mysqldumpしてリストアかな
42 :
NAME 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回避するとか そういうケースのみと考えて良いのかな? ご意見よろしくお願いします。
libmysqlclientが使ってるプロトコルをjavaで実装できないか検討してます。 理由はjavaで直にmysqlと通信したいからです。 調べた限りではなかったのですがすでにこういったjavaのクラスは公開されてるでしょうか? 実装するとしたらprotocolbufferとか使えるのでしょうか. 識者の方,ご教授ください.
commitするかどうかはエラーをラップして決めるんじゃない? php風に書くと try { $dbh->beginTransaction(); (アップデートとかの処理) $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); } みたいな感じで、ちゃんとエラートラップしないと意味ないような気がする
>>43 よくわからんけど、JDBCじゃダメな理由は?
理由はかけませんが直でmysqlと通信したいのです。
Cならlibmysqlclient使います。 javaのクライアントでmysqlと直で話をしたい、JDBCは使いたくないわけです。
>>48 ソケット通信でも自分で実装すればいいんじゃね?
最悪、自分で全実装すればいいですが、 どこかにすでに公開されたクラスがないか、 または楽に実装できる方法があるか、たとえばprotocol bufferを使うなど、 知りたかったわけですが
51 :
NAME IS NULL :2010/06/21(月) 14:51:06 ID:8qylY79Y
>>44 レスありがとうございます
try〜catchの形は理解出来るんだけど、その(アップデートとかの処理)の中に
たとえばinsertクエリの結果の検証(ちゃんと一行増えたかな?)とかも含めるの?
事前にチェックした行数とクエリ後のlastInsertId()の値を比較するとか。。
Mysqlの本やサイト見ても、クエリ文のすぐ下にcommit();が書いてあるばかりで
そういうチェックしてるのなんて見たことないんで軽く混乱してる。。
エラー(カラムのデータ型と送信値のデータ型の不一致とか)でクエリ失敗するとロールバックされるのは
わかるし、同様に上みたいな検証しなくても「ちゃんと一行増えない=エラー発生」の時も
ロールバックされると思ってたので、チェックの必要なんて無いのではと思ってたんだけど
どうなんだろう?
>>51 insertコマンドがエラー返さなければ、暗黙の了解で成功したと見れるんじゃないの?
てかそれがbegin>commitの意味だと思うけど。
53 :
NAME IS NULL :2010/06/21(月) 15:17:00 ID:8qylY79Y
>>52 そうですよね!? それなら良いんです、安心しました
他の人の意見ももらえたら嬉しいですが、、 ありがとう
そんなの言い出したら今度は 確認用のlastInsertId()をさらにチェックするとか 始まるだろ。 やりたきゃ好きなだけやれよ。
複数のWebサービスから利用されているMySQLサーバを運用しているのですが、 このサーバがここ最近突然重くなりました。 大したアクセス数のあるサイトを持ってるわけでもなく朝方のような時間帯でも重いので 何か特殊な原因があるのではないかと考えて調査しているのですが検討が付きません。 topコマンドを叩くと、 load averateが平均で3〜5ぐらい、高い時で10を超えたりします。 またmysqldコマンドの%CPUの値が100%を超えて300%ぐらいになります。 ここら辺が異常なのは分かるのですが原因が分かりません。 何か考えられる原因はあるでしょうか?
お前さん岡崎市立中央図書館のシステム作った会社の人か?
まずはスロークエリログを設定してデータ収集して調べるところから。
Workbench使おうと思っても PW入力してコネクトしてるところから進まない 応答なしになるんだけどなんで? mysql 5.1 bench 5.2
60 :
NAME 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秒かかるのはやっぱり遅いですよね?) よろしくお願いします。
サブクエリは使わない条件なのかい? ちなみに歌手が違うジャンルの曲を歌ったときの対応とかどうよという気がしないでもないが。
63 :
NAME IS NULL :2010/06/26(土) 20:36:38 ID:TQu1MBDb
>>61 調べてみます
>>62 実際にはここで歌手番号と同時に歌手名も取得し、
歌手番号と歌手名の連想配列をとりあえず変数に入れておいて、
最終的にどの曲がどの歌手のものなのかを表示しているので、
サブクエリは使っていません。
歌手とジャンルの対応を言われると厳しいです。
曲といっしょにその曲のジャンルまで収集できる仕組みを作れればいいのですが、
そこがうまくいかなかったのでとりあえず歌手は特定のジャンルのみとしました。
歌手が別のジャンルの専門になったら、
歌手ごとにジャンルを変えてしまおうという感じです。
>>60 曲番号を1カラムにまとめないで、歌手番号と歌手毎分類番号の2カラムで
複合主キーにしたら?
>>63 >サブクエリは使っていません。 (キリッ
いや、そういうのを聞きたいわけじゃなくて、「特定のジャンル、歌手番号、歌手名、曲番号、曲名」を
1クエリで引っ張ったらいいんじゃないの?という話なんだが。
ジャンルとか曲番号にindexが張られていないとかいうオチじゃねーだろーな
67 :
NAME 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 ジャンル、曲番号にはインデックスが張ってあります。
以上、よろしくお願いします。
頭が変になりそうだ、
>>67 ボトルネックは明らかにPHPでのループとインデックスの使われてないであろう曲番号LIKE検索だろう。
DB構造もロジックも両方直さないとな。
テーブルの中で日々増大するテーブルがあり、 それは滅多に使わないものですが、とっておきたいデータです。 私としては定期的にダンプしてzipで圧縮後、テーブルデータを削除したいのですが、 dumpコマンドでダンプしたデータが壊れていないかどうかを確かめる方法を探しています。 私としては、dumpコマンド実行中になんらかしらの障害が発生してデータが壊れているのにも関わらず、 ダンプが終わったと判断して、テーブルデータを削除していますケースを心配しています。 全ては、定時バッチで処理したいと考えています。アドバイス宜しくお願いします。
ちなみに、 MySQL5.1、InnoDBを使っています。宜しくお願いします。
障害が発生したらmysqldumpが異常終了すると思うけど、 気になるなら別のサーバにリストアして件数でも数えてみたらいいんじゃないの
74 :
NAME IS NULL :2010/07/07(水) 15:49:13 ID:o6uZh2cy
既出だとは思うのですが、ネットで調べても具体的な数値が見えてきませんでしたので質問させてください InnoDBとMyISAMは後者の方が早いらしいですが、大体どの位スピードは違うのでしょうか? 大規模なDBなど扱ったことがないので分からないのですが、今までもDB以外の分野でこっちの方が高速と書かれていても、実際はさほど差はないということも多々ありました 体感的、具体的にはどの位早いのでしょうか? もしそれほどパフォーマンスに差がないようならばInnoDBに一本化しようかと考えているのですが
>>74 >>InnoDBとMyISAMは後者の方が早いらしいですが
使い方によるんじゃない?
パフォーマンスに多少の差があってもInnoDBに一本化していいと思う
トランザクションがない時点でステ>MyISAM
79 :
NAME IS NULL :2010/07/07(水) 19:13:20 ID:dGxQf47y
トランザクションがないなら NoSQLで良いな
今、MySQL5.1.19を使っていて、 これからMySQL5.1.47にバージョンアップしようとしているのですが、 MySQLを停止して、MySQLのモジュールをインストール(BSD環境なので、make→make install)して、 MySQLを起動するだけで大丈夫でしょうか? (1) 設定ファイルを書き直す必要がありますか? (設定項目が削除されたり追加されることがありますか) (2) データベースのファイルの互換性がなくて既存のデータが壊れるようなことはありますか? 宜しくお願いします。
81 :
NAME IS NULL :2010/07/07(水) 20:02:52 ID:wE54BEI5
一つのフィールドの定義に悩んでます。 当分の間であればDECIMALの5桁で大丈夫なのですが、 理論的には10桁が必要です。 件数が1000万件を超えるのですが、 5桁で定義するのと10桁で定義するので、データが違ってきますか? 定義とデータの大きさの関係が分からないので、どなたか教えて下さい。
>>74 に関連して。
そういえばMyISAMを利用しないようにしてもいいのでしょうか?
そもそもできないかもしれませんが、skip-myisamしてユーザテーブルとかをalter talbe engine=innodb;してもいいか、迷ってやってません。
そんなことしたらテンポラリテーブル作れないよとか、じつはシステムが利用するエンジンを変えて運用する
tipがあって、とか、おもしろいヒントがあれば教えてください。
ちなみにその目的はメモリ使用量を下げたいがため、です。
84 :
hage :2010/07/08(木) 07:15:23 ID:???
>>80 freebsdだとportupgradeしてmysql再起動すればさくっと動きました。
5.1とのおつきあいもちょくちょくあげながらかなり長くなってきました。
5.1系列から5.5にしたら一部クエリで性能ががた落ちしたので取りやめとなりました。
エンジンが増えたり減ったり、ログのフォーマットが変わったりするとデータが壊れる(認識できない)こともあるでしょうが、
同系列なら大丈夫です。
同系列での設定ファイルはあまり書き換えなくてよいです。違う系列だと動作が違ったり、大幅に変わってたりで困ります。
たしかデフォルトのレプリケーションのリレーログへ書き込むか否かの挙動だとか、スレッドの本数の設定だとかが
違った覚えがあります。
skelファイルついてくるのでそれを見ながら書いてますが、51同士だと変更もなかったはずです。
なおオプションなどでdeprecatedされていくものはエラーログに記録されます。
流行について行けないとある日突然困るかもしれません。
なので(1)への返答はNo、(2)への返答もNoです。
ただし万全を期してフルバックアップはお忘れ無く。
MySQL勉強中の、未熟者です。 本を読んでも実務に直結する内容の情報がなかったので質問させてください。 仕事(業務)で、webアプリケーション用のDBを構築しなくてはいけない状況で、 クライアントさん(お客さん)のサーバーで作業、動作確認ができないという場合、 仮に他のサーバー上でテストしておくというのはよくあることなんでしょうか。 他のサーバーでテストして作っておいたデータベースを お客のサーバーでまったく同じように再現する?感じですか。 その場合、サーバーへのアクセスはSSHで行うというので正しいでしょうか。 レベル低い質問ですみません。
仕事なら上司に聞けばいいんじゃねーの?
>クライアントさん(お客さん)のサーバーで作業、動作確認ができないという場合、 >仮に他のサーバー上でテストしておくというのはよくあることなんでしょうか。 よくある、というか、普通はそうなる。 >サーバーへのアクセスはSSHで行うというので正しいでしょうか。 前段との関連が意味不明だけど、 物理的(インフラ)なテストと、論理的(アプリ、データ)なテストとでは目的が違うから、何が必要かは一口には言えん。
>>83 内部データを格納するmysqlデータベースがMyISAMで作られているので
skip-myisamはできない
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 ここを参考にしながらやったのですが、どうも上手くいきません
どのようなクエリを書けばいいのでしょうか?
よろしくお願いします
試しちゃいないが、こういう感じのこと? 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
>>90 ありがとうございます
日付のとり方でODBCのエラー(VARBYTE)が出ましたが
そこだけ変えたら上手くいきそうな感じになりました
92 :
NAME IS NULL :2010/07/12(月) 12:22:41 ID:HNUgzOdL
mysql のコマンドプロンプトで mysql> desc table1; とすると、経線付きの表形式で結果が表示されますが、 unixのコマンドラインで % echo 'desc table1' | mysql -u root dbname とすると、経線がつきません。 unixのコマンドラインで実行したときも、経線付きの表形式で結果を取得したいのですが、どうすればいいでしょうか。 なおunixのコマンドラインで実行するのは、シェルスクリプトで使いたいからです。 よろしくお願いします。
>>92 mysql -u root dbname -e 'desc table1'
isattyで出力を切り替えてるから これじゃリダイレクトかパイプすると駄目だ スマソ忘れてくれ
-tオプションで良さげ
>>95 -t オプションできました!ありがとう、愛してる!
97 :
NAME IS NULL :2010/07/12(月) 17:18:54 ID:mKjPxL2y
mysqlって構造が全く同じなら1つのテーブルにまとめたほうが高速なの? 数千万件のレコードから検索する場合。 大量の小さなテーブルから1つのテーブルを選択するコストと 1つの巨大なテーブルから1レコードを選択するコスト どっちが大きいのか? 何か判断の指針ある?
インデックス張ってあるカラムで検索するんだったら、 件数大量でも大して遅くないでしょう。 下手な条件指定で遅い検索になっちゃってるなら、 件数にリニアに比例しちゃうことも。 その場合は少々件数が少ないテーブルでも遅いわな。 というわけで、んなこと考えとらんで、適切なカラム構成とインデックス、 それとSQLの最適化に頭使った方が良いよ。
read/writeの割合が半々とwriteの比率が高くクラッシュしても空テーブルから再始動することが許容されるinnodb mysql においてI/Oがボトルネックで悩んでいる場合、データディレクトリをtmpfsにすることはありでしょうか?
メモリにおきゃいいじゃん>テーブル
クラッシュ時のデータ損失が許されるなら innodb_flush_log_at_trx_commitを2にしてみて。
102 :
NAME 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時に問題がでると思って
大量の小さなテーブルって方を選択しました。
初心者質問ですみません。 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を追加できるようになるのでしょうか?
104 :
103 :2010/07/16(金) 19:10:58 ID:???
追記です。 レジストリエディタを見たところ、ODBC\ODBCINST.INI配下にMySQL ODBC 5.1 Driver というのがあるのですが、オープンエラーになって内容が見れません。 この配下にdllファイルの設定ができるようなので、ここが更新されれば 上手くいくような気がするのですが…
105 :
NAME IS NULL :2010/07/17(土) 22:22:18 ID:WEWF6qwE
フリーのMySQLを使っています が、有料版のMySQLとの違いが知りたいと思います 具体的にどのような所がフリーと有料とで違うのでしょうか?
サポート
ソース共通だからダウンロードしてくれば商用版ビルドできるよ ログイン時のメッセージが変わります
108 :
105 :2010/07/18(日) 13:24:25 ID:???
>>106 サポートだけなのですか?
確かにMySQLの本とかでも商用版とフリー版でこういう機能が違うというような一覧など見かけたことはありませんが
>>107 そうなのですか
それにログイン時のメッセージくらいなものなのですか・・・
ライセンス条項読めばいいんじゃね?
そうかなぁ、1台だけだとまぁって感じだけど数台ともなるとコストも馬鹿にならないし
もう一人コード書きを雇おうか、ってときの選択肢なんだからこんなもんだろ。 BASICは、サポート代ってより子守代か。
115 :
NAME IS NULL :2010/07/23(金) 08:42:20 ID:REpy7JWz
MySQLにレコードを登録更新するときにはどのようにされてますか? いったん既存のレコードを読み込んで、 キーのチェックをして、既に存在していればUPDATE文、 存在しなければ、INSERT文を発行するといった具合にされてますか? INSERT ... ON DUPLICATE KEY UPDATE 構文は便利なんですが、 キーが複数個ある場合はあまり使えないようなので、 みなさんがどのようにされているか気になりました。 なお、開発言語はPHPを使用しています。
XAMPPをインストールしましたが 5.1.41の日本語化がわかりません googleで検索してもやりかたがいまひとつ理解できませんでした 5.0.41はできました my.cnfからmy.iniになってるし、どなたかわかるかたいませんか?
文字列 '1:00' は 60秒、'1:00:00' は3600秒と解釈させるにはどうしたらいいでしょうか。 select time_to_sec('1:00'); とすると、3600となってしまいますが、これを 60 と解釈してくれるオプションがあればいいのですが。
>>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)
ごめん1:0:0のときにバグるね あとはまかせた
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 とでて、起動しませんでした。 どうすれば起動するようになりますか?
>>120 pidファイルやsocketファイルの置き場所として
・CentOS5の付属版は /var/run/mysqld
・本家は /var/lib/mysql
を使うようになっている。/etc/my.cnfを編集してどちらかに揃えよう
122 :
NAME IS NULL :2010/07/29(木) 22:36:37 ID:ZaZ5fIWy
更新・参照ともによく使いテーブルがあり、 そのサイズが現在5GBあります。 今後も増える見込みで、10G、20Gと増えていくのですが、 このような場合、テーブルを分けた方が宜しいでしょうか? 具体的には、同じ構造のテーブルに、データのサブカテゴリー別に振り分けるようなイメージです。 DELETE、INSERTを繰り返すため、定期的な最適化が必要で、その為には一つ一つのテーブルが小さい方がメンテナンスを細かく行なうことができるので、メリットがあります。 それと、今後サイズが更に増えた場合、処理速度が落ちないか心配です。 アドバイスを頂けたら幸いです。どうぞ宜しくお願いします。
履歴データとかで、もう参照しないデータなら別テーブルに分ければいいと思うが、 参照するデータを別テーブルに分けて、どうやって運用していくつもり? メリット以上にデメリットが多いんじゃないの?
124 :
NAME 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になると扱いにくくならないかの方を心配しています。
125 :
NAME 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 *******) みたいな形で複数を一度にインサートするスマートな方法はありますでしょうか
つ (select 1,2,c from *** where *******)
ありがとうございます!
できました。スマートになりました。 あとは速度的な問題ですが、検証してみたいと思います。
速度はほとんど変わりませんでした
もうひとつお願いします。 SELECT a,b,c FROM table1 where EXISTS (SELECT * from table2 where a=hogehoge) これは テーブル table1 のカラムa と テーブル table2 のカラムhogehogeが合致するものを検索 でよかったでしょうか。 よろしくお願いします。
× 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) に訂正します。
>>130 その書き方はおそらく性能が悪い。普通はこう
SELECT t1.a, t1.b, t1.c
FROM table1 t1
INNER JOIN table 2 ON t1.a = t2.hogehoge;
>>132 評価式の左右がどっちとかRDBMSには関係ないよ
>>133 誤記
>INNER JOIN table 2 ON t1.a = t2.hogehoge;
INNER JOIN table t2 ON t1.a = t2.hogehoge;
>>136 いやー少なくとも今のバージョンは関係ないと思う
オプティマイザは最初に推移律が成立するものを
ゴリゴリ書き換えて、左右もそのときに直すはず
だけど証拠がないので時間があったらソース確認してみる
138 :
NAME IS NULL :2010/07/30(金) 13:41:23 ID:eCwiMoLf
>>131 頂いた内容を拝見しましたが、とても便利な機能ですね。
長く使っていましたが、初耳でした。もしかしてMySQLの開発者の方でしょうか?
大変助かりました。早速来週から使ってみようと思います。
これからも、ご活躍を願っております。
初歩的ですみません。 ユーザ情報のテーブルを作成し、フィールドにパスワードの項目を追加したのですが、 SHOW FIELDS FROM [テーブル名]; としたときに、パスワードの列を****のように表示させることはできるのでしょうか? ぐぐってもMySQLの管理者パスワード関係のものばかりで、うまくヒットしないもので・・・。
パスワード見たくないなら、カラムにはハッシュ化後の値を書き込むよろし。
基本的にはINNER JOINって遅いんですかね? 普通に抽出したものをperlなりphpなりで仕分けしたほうが断然早かったです。 SQLの書き方が悪いのかなぁ
INNER JOIN *** ON (a = b) これだと a=b の条件にマッチしたものをjoinしますが 逆にa = bが成立した場合はjoinしないという方法はありませんでしょうか !=だとインデックスが使われないので悩んでます
いろいろ調べましたらjoinが遅いのではなくて その後のorder byが遅いのがわかりました。 joinしたものにはインデックスが適用されてないということですね。 joinする前に予めソートしておけばと思うのですが そのような事は可能でしょうか。 やり方を教えていただけると嬉しいです。
>>142-143 INNER JOIN *** ON (a != b)
これってCROSS JOINしてその大部分の結果を使うのとおなじことでしょ。
そうすると結合に関しては、インデックスは使わないというより使う意味が
ないんじゃないかな。
情報が少ないからエスパー混じるけど、ORDER BYで複数テーブルの
フィールドしているのが原因かと。
>>144 読めば分かるけどテーブルを跨いでソートする場合、結合した大き
な結果セットをソートするから遅くなる。
一時テーブル(a, b)を作って、これにインデックスを張っておく。ORDER BY
はこの一時テーブルのを指定して、この一時テーブルに対して結合するように
すれば軽くなるかもしれない。
146 :
NAME IS NULL :2010/08/01(日) 12:08:00 ID:q3fWzOwJ
ソートキーが一方のテーブルのフィールドのみからなって、そこにインデックスが
ある場合が一番速いってことだろ、
>>144 は。
つまりNestedLoop最強。
147 :
143 :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
148 :
143 :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倍違いました。
コピペミスってるのか知らんけど 遅い方の Yid = Wid と 速い方の chk.Yid = t1.c の条件がかみ合ってないよ
150 :
143 :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
下のパターンで速くなるなら、 上のクエリに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見せてほしい
152 :
143 :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になりました!!!すごい!!!!
153 :
143 :2010/08/01(日) 16:52:44 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に増やしてみるぐらいかな
MySQL 5.0.91 CentOS 5.4 DBアクセスを参照のみに制限したくて、 GRANT SELECT on `test-db`.* to `db-user01`@`%` identified by 'password'; FLUSH PRIVILEGES; とやったのですが、試したら普通にUPDATEできてしまいます。 書き込みを制限するにはどうすればいいんでしょうか?
基本的な事聞いていいですか where a=1 and b=5 and c=abc a,b,c全てにインデックスを貼っている場合と、一つ或いは二つしか貼っていない場合だと速度は違いますか つまりwhereで使うもの全てにインデックスを貼ったほうが性能があがるんでしょうか
はい
ありがとうございました。
>>155 よくあるのがdb-user01以外で繋がってしまっているケース
mysql> status;
してCurrent user: を確認してみて
>>159 どうもです。PHPからdb-user01で接続しているのでそれはないですね。
人に聞いたら、そもそもそういう書き込み制限はできないみたいです。
じゃあGRANT SELECTって何よ、って気もしますが…。ぐぐったらできそうなこと書いてあったんですが
実際できないものはしょうがない。
アプリ側で誤って書き込まないよう気を付けるしかないようですね。不安だ。
ほんとに、updateとかの権限が無いかどうか確かめてみては? use mysql; select * from user where user='db-user01'\G
>>161 どうもです。
いろいろ試してる間にSELECT権限も消しちゃったのか、priv関連は全部Nになってました。
それでも参照も書き込みもできます。
そしたらあとはmy.cnfに skip-grant-tables が入っているとか?
164 :
NAME IS NULL :2010/08/03(火) 23:30:14 ID:DnqSeYXe
MySQL Clushter(GPL版)についてお尋ねします。 web上での情報を集めていて、これから導入するか検討中です。 (1) 更新処理の際に、全てのデータノードに更新をかけるという仕組みのようですが、 それだと、1台の時と比べて著しく遅延したりすることはないでしょうか? (2) これは、冗長性を確保するための機構で、パフォーマンスを改善させるための機構としては有効ではないのでしょうか? 私の運営しているサイトが次第に人が増えて乗り換えが必要になってきたのですが、 冗長性と同様にパフォーマンスも改善したいと思っています。
導入しない方が良いと思うな。ありゃ有料サポート必須。
166 :
NAME IS NULL :2010/08/04(水) 02:52:37 ID:urkSox1R
ありがとうございます。 もし、宜しければ理由をお聞かせ頂けると助かります。 ドキュメント不足で、エラーの解決に時間が掛かる。 構成が複雑で、独学では時間が掛かる。 有償オプションが付かないと実質的に運用に耐えられない。 などですか?
それが調べられれないレベルだからだと思うが。。
168 :
NAME IS NULL :2010/08/06(金) 06:43:05 ID:gPbyC/Ky
冗長性とパフォーマンスなんて相反するもの。 普通はトレードオフを考えるもんだ、まともなエンジニアなら。 サイトといっても、課金などのミッションクリティカルな運用してるわけではないようだから、 水平分割や垂直分割のキーワードで負荷分散の方法を調べるのが吉。
このレスの少なさから判断すればいいね>MySQL Cluster はたして将来流行るんだろうか
ここ数年5.0.51を使っています 最新版にアップする価値はあるでしょうか。 サーバーはi7を使っていて マルチコアへの改善点があるようなので興味があります。
MyISAMは変わってないよ InnoDBならやってみる価値あり
ありがとうございます。
173 :
NAME IS NULL :2010/08/07(土) 12:38:44 ID:pe8wzQKR
>>170 OSなに?
Windowsだとダメだよ
175 :
NAME IS NULL :2010/08/07(土) 15:04:55 ID:pe8wzQKR
スレッド回りの改造はLinux前提だから。
MySQLを独学しようと思ってるんだけど、 独学する上で何かいい課題ありませんか? 業務ではなく個人レベルだとどうも土台及び課題が設定しにくくて困ってます。
いまさらMySQLなんてやめとけ。もうMySQLは終わってる 中の連中もOracleに取り入ろうとする連中と反発する連中とで完全に分裂状態
そうなんですか。 就職に有効だと思って始めようと思っていたのですが下火だったとは。 一般的な質問はスレチになるので他に移動します。ありがとうございました。
>>173 ,174
MySQL信者は前提書かずにいいとこだけ宣伝するからダメ
MySQLは速い!(MyISAMだとね)
MySQLはトランザクション対応 (InnoDBだけどね)
そして「MySQLは速くてトランザクション対応!」ってなプロパガンダをやる奴が多かった。
MySQLのデフォルトはMyISAMだろ、っていうと「デファクトはInnoDB」なんてさらっと書いてごまかす
薄汚い漢もいる。
もう勝負はついたから黙ってOracle無償版使っとけ。
てかSQLなんて対して違いないんだからコードなんてすぐ書き換えられるじゃん 後、そこらへんのWebサーバーにはMySQLしか入ってないんだよね
流行り廃りがあるからDBは2製品以上覚えといたほうがいい Oracle+PostgreSQLとかSQL Server+MySQLとか
へえoracle無償版なんてあるんだ 有償版とはだいぶ違うの? (、、、とぐぐりもせずにしらっと質問)
183 :
NAME 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 という感じで順位を得てますがゲームやユーザ数が多くなると当然重くなります... これを解決する方法って何かありませんかね?
>>183 gameidとscoreの複合インデックスつくっておけば、
数百万件までは問題ないんじゃない?
どうせ下位のほうは消しちゃえばいいわけだし。
>>184 なるほど、ありがとうございます。
その方法で評価してみます。
>>184 ,185
検索条件が不等号だからrange検索になってインデックスの効果がでない。ほとんどの場合フルテーブルスキャンになる。
186の指摘通り、集計用のテーブルを別に準備してcount(*)で舐めるテーブルの範囲を極力小さくするように設計しなおしたほうがよい。
ちょっと前までKVSやNoSQLが喧騒されて、key=uid+gameid, value=scoreで分散キャッシュすればスケーラビリティ確保!!RDBは過去の遺物!
みたいな感じだったけど、NoSQLつうかKVSってこういったリアルタイムの集計がまったくダメなんだよな。
修正 >検索条件が不等号だからrange検索になってインデックスの効果がでない。ほとんどの場合フルテーブルスキャンになる。 「ほとんどの場合フルテーブルスキャンになる。」は嘘。 「結果的にテーブルのほとんどをスキャンすることになる」 要するにインデックスで絞りこめないってこと。ランキング1位ならいいけど、下位ほどスキャンするカラムが多くなる。
スコアも含めたインデックス作るって、 もしや誰かが自己記録更新する度に、インデックスの再編成が起きる?
全体の再編成は起きない 断片化とツリーの深さ調整はかなり起きる
>>186 Greeの記事大変参考になりました。
精度を犠牲にして定期的に区切りの順位の得点を集計したりと考えてみましたが
もう少し色々考えられそうですね。
ニコニコ動画の毎時集計 ブラウザ三国志の1日2回集計 ぐらいでもいいんじゃないかとは思うけどね
>>192 単純なランキング閲覧ならそれでokですが
ゲーム終了後にスコアに対して今のオンライン
ランキングを提示したいので...
別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接続できます。
195 :
NAME IS NULL :2010/08/10(火) 15:53:23 ID:pVnLtg0K
ageます
ちゃんとgrantせんと
>>196 リモート接続の許可はしてますが、他にも何か必要でしょうか。
非常に初歩的なミスについてなのですが、ご存知の方がいれば教えていただけませんか? Windows版 Xampp1.7.3をインストールしたのですが、 ブラウザーからphpmyadminの画面に移りMySqlのrootのパスワードを設定しようとして 誤ってrootそのものを削除してしまいました。 復旧の仕方が良く分からないので、Xampp自体再インストールしてしまおうと アンインストール > 再インストールを行ったのですが、 rootを削除してしまった状態から元に戻すことが出来ません。 Xampp自体のフォルダーがなくなっている事、念のためリジストリ上のXamppに該当する 記述も全て削除したのですが、やはり同じです。 他に何か関連ファイルが残っているからだとは思うのですが、それを見つけることが出来ません。 Xamppを完全に新規インストールするためにはどうすればいいのでしょうか?
すみません、自己解決しました。 原因は分かりませんが、何度か繰り返しているうちに上手くいきました…。
こういう人こそ仮想化してスナップショット機能を活用するべき
>>198 すいません。落ち着いてそこを見て
grant all on *.* to root@'%' identified by 'hogegege';
としたらうまく行きました
質
質問があります。 ぜひアドバイスをお願いします。 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 | +-------+------------+ お詳しい方、どうぞよろしくお願いします。
プロシージャしかない気がする
ご
>>205 ,206
教えていただきありがとうございます!
調べたのですがいまいち確証が得られていないことがあるのですが、
プロシージャ内の処理はトランザクションのような保証はないのでしょうか。
もしないとすれば、おとなしくInnoDBにして
アプリケーション側でルーチンを組むのがよいのでしょうか。
InnoDBにしてストアドプロシージャを使えばいいと思うけど。 複数レコードをアトミックに更新しないといけないから、 MyISAMの場合はプロシージャだろうがアプリで手組みだろうが 最初にLOCK TABLESしないとだめだね。
>>208 > プロシージャ内の処理はトランザクションのような保証はないのでしょうか。
ストレージエンジン次第。プロシージャかどうかは関係ない。
>>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の値が入っていてほしいのになにも入っていない
---------------
ふつーに動いたよ。コピペして、プロシージャ、point_table 作って、insert。 SELECT 20 INTO out_return; の代わりに SELECT 20; でもおk
>>212 ありがとうございます!
取得部分で構文を間違えていたようで、
その部分を修正したら期待通りの値が取得できました。
単純に SELECT ○; でもいいのですね。
勉強になりました!
こうなるとOUT out_return INT UNSIGNEDの
存在意義がいまいちわかりません…。
と思ったら、SELECT ○; にすると OUT out_return INT UNSIGNEDは普通にいらなくなるのですね。 失礼しましたー。
プロシージャについて、もう一点教えていただけないでしょうか。 一連の処理内でテーブルから値を取得するときは 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); としても取得することはできませんでした。
今MySQLの勉強をしています。 で思ったのですが、どうしてINSERT文とUPDATE文では、これほどまで書式が違うんでしょう? 正直INSERT文の書式に統一して、複数のレコードを一気に更新できるようにしてほしいと思います。
>>215 enumやsetの性格を考えたら、わかるじゃまいか。
>>216 update hoge (c1,c2) values (1,2) where cd = 1; つーことすか?
あんまり変わらないような?w
だいたい複数レコードを一気に更新は、現在でも
218 :
215 :2010/08/13(金) 10:21:03 ID:???
>>217 ありがとございました。
勘違いでして、普通にVARCHARに入れることができました。
また、カーソルなのですが、ドキュメントとを読むと「読み取り専用」とありますが、
宣言後に内容を書き換えたり、
もしくは変数名とCURSORという型だけ宣言しておいて、
中のSELECT文はあとから代入する、というようなことはできないのでしょうか?
SELECT (SELECT 10) AS ten, ten + 20; このようにサブクエリで得た値を使い回したいのですがうまくいきません。 何かこれを実現する方法ってあるのでしょうか?
220 :
216 :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の挙動はどうなりますか?
>>219 select a.c1, a.c1+10 from (select 10 c1) a
サブクエリで得た値を使い回し、という要件を満たしてはいると思う
>>218 >>220 の疑問は、やってみれば分かるものだから、がんばってください。
222 :
NAME 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がヒットします。 小数点以下の桁数が関係あったりするのでしょうか?
手元の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)
225 :
222 :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
想定する動作になったのですが、こんな処理で合っていますか?
その数値を使って計算をしないんならdecimalでいいんじゃないか
つか、例えば小数点以下3桁までしか要らなかったら、1000倍して整数にすれば楽だろ。
228 :
222 :2010/08/17(火) 13:00:25 ID:74Z9QDfh
貴重なアドバイス、ありがとうございます。
>>226 計算はしないです。
単純に登録してある緯度経度をGoogleMapに表示するのに使うだけです。
小数=float or doubleという概念しかありませんでした。
decimalも試してみます。
>>227 整数にしてしまうというのも盲点でした。
intの上限があるので、実際にどの桁数まで保存するか決め手から考えて見ます。
229 :
NAME IS NULL :2010/08/20(金) 23:10:03 ID:T6613nBq
show processlist;は実行中のスレッドを表示しますが、 これをLinuxのTOPコマンドのように、リアルに更新する ように見れる方法はありますか?
mytopでぐぐってみたらいいよ
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`を追加しても期待した値が取れませんでした。
thread_table をあらかじめソートしたものを from user_table a, (select * from thread_table order by dated desc ) b 結合。group byすればよい。 group by thread;
>>232 できました!
まだgroup byの挙動が分かっていないので勉強したいと思います。
ありがとうございました。
質問です。 いろんなテーブルを結合したSQLで、 その一部にだけFOR UPDATEをかけることってできませんよね? そういう場合はクエリを分けるしかないんでしょうか。 単純な例として、 ユーザー情報と、それに関連するマスタデータを取りたくて、 ユーザ情報はロックしたいけどマスタデータはロックしたくないとき、 1.ユーザー情報だけをSELECT FOR UPDATE 2.ユーザー情報とマスタデータを結合してSELECT(ロックしない) とするのが普通?
トランザクションの使用について質問があります。 これまで、 SELECT文を実行する場合には、 トランザクションを入れていなかったのですがこの方針は正しいですか? DELETE / INSERT / UPDATE の場合には入れてます。
>>235 SELECTだけでも複数発行する場合に
途中に他の更新が入り込んで整合性がおかしくなるとかあるじゃん。
>>236 ・・・頻繁に更新・削除のあるシステムの場合には確かにそうですね。
今後はおとなしく入れます。。。
いや、それを言うと全トランザクションをSERIALIZABLEにしないといけない よその更新をどこまで見せるかはあくまで要件次第
>>238 画面自体は
SELECT される頻度が、それ以外よりも大きいのですが
トランザクションを入れると入れない場合と比較して
やはりパフォーマンスは落ちますよね?
測ってみないと分からん
1レコードのサイズについてお聞きしたいのですが レコードのサイズによってSQLのスピードが変わってきたりするのでしょうか? テキストを保存しようとしているカラムがあるのですが、 varchar(255)とlongtextで迷っています longtextにすればサイズの問題はないのですが、スピードや負荷に影響があるのかどうかが知りたいです ご教授よろしくお願いします
そのデータの中身に対して検索掛ける必要がまったくない(ただの保管庫として使う)なら、longtextでいいんじゃない?
>>242 ありがとうございます
検索はかけないのでlongtextでいきます
244 :
NAME 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になります
PHPからMYSQLを使っているのですが、データが無い時(null)に何故か、 スラッシュが表示されます。 これはこういうものなんでしょうか?
247 :
代行 :2010/09/03(金) 00:09:13 ID:t3hAyKGJ
mysql 5.1.46 winXP show varibles;で示される内容をテキストファイルに落とす方法を教えてください
-e で >
249 :
247(代行依頼経由) :2010/09/03(金) 17:30:46 ID:MQIrgEEP
>>248 有難うございます
mysql -u**** -p -e "show variables" > "c:/variable.txt"
で出来ました
初心者ですみません。 2万件毎に区切られたCSVファイルを10万件分登録するとして、データの追加はどのようにすれば良いのでしょうか? サーバーの仕様なのか、INSERTできる件数の上限があるみたいで相当な時間が掛かってしまいそうなので…。
ツールを作っておくんだ。 ○○行ずつ、insert文で突っ込み、待ち○○秒。 1ファイルが終わったら次。 その間、股間でも弄っているがよい。
253 :
250 :2010/09/03(金) 23:15:02 ID:???
>>251 バッチとかで大丈夫でしょうか…股間はやめときます。
>>252 オートコミットで検索してみましたが、良くわかりませんでした。
初心者はINSERTでちまちまやります。
どうもでした。
とりあえずマルチプルINSERT。
>>250 LOAD DATA INFILEじゃ駄目なん?
>>250 INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
通信バッファサイズというのがあってだな。 で、あの質問になったんだろ。
うん
INDEXって付けると本当に速くなるの? そこまで、大きいDBを扱ったことが無いからわからない
大差無い
レコードn件に対してO(n)かかる処理が O(log n)で済むから速くなるよ
263 :
260 :2010/09/04(土) 21:03:00 ID:???
今まで使いやすさからSQLiteを使ってたんですがMySQLにチェンジしようと思います そこで質問なのですが、SQLiteに慣れてばMySQLに慣れるのも早いのでしょうか? それとSQLiteで作成したデータベースを移行したりできるのでしょうか?
ーーーーここまでよんだーーーー
>>264 その程度の判断ができないなら、今のままのほうが良いよ。
そんなに冷たくするなよ。
>>264 様は、調べに調べたんだよ。
googleで「sqlite mysql 移行」で最初に出てくるページももちろん見たさ。
けど、create redmineで躓いてしまったんだよ。。。
調べないでいきなり質問するわけがない。
レプリケーションで下のような構成にしようと思ったんですがスレーブ→スレーブって無理ですか? マスター ↓ スレーブ1(スレーブ2のマスター) ↓ スレーブ2
>>268 多段スレーブできるよ
log_slave_updates でぐぐれ
その場合、 [mysqld] log_slave_updates read_only という指定でいいんでしょうか?
272 :
268 :2010/09/06(月) 17:46:02 ID:???
274 :
NAME 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つけなくてもいいと思うのですが…パフォーマンスが変わってきます?
s_idが主キーなら結果セット、性能いずれも limitつけてもつけなくても変わらない
>>274 アホが「s_id = 1」だけ変更するからそれの保険とか、
PKだと知らなくても1レコードしか返らないのを明示できるとか。
DB側もテーブル定義まで知らない立場でもなんらかの最適化がかけられなくもない。
実際の実装はしらんけどね。
なんかの不具合へのアドホックな対策みたいで気持ち悪いわ
278 :
274 :2010/09/07(火) 16:33:39 ID:C1jYjJT2
>>275 性能も変わらないのですね、ありがとうございます。
>>276 >PKだと知らなくても1レコードしか返らないのを明示できるとか。
これくらいしか思いつかないですよね。
ですが、phpで接続しており、先頭の1レコードしか処理してないんですよ。
仮に主キーじゃなく、複数レコードが返ってきても先頭しか処理されない…
>>277 このような記述が多くみられるので、違和感を感じていて質問したのですが、ますます違和感を感じるようになってしまいました。
create redmine;
MySQLの情報の探し方って、意外と難しいよね。 やっと見つけても、ブログ書いてる人の文才が無くてまとまっていなかったり・・。
公式嫁よ
公式の訳最悪 英語読んでもやっぱりわかりにくい
MySQLエキスパートの方に質問 ユーザーIDを単なる連番にすると推測されてしまうので md5した値にしたんだけど、32文字の文字列を事実上キーとして使うと 速度低下しますかね? もちろんちょっとぐらいで済めば全然良いんだけど ていうか自分で計測しろってか、すみません
>>285 推測されてまずいことあるの?
md5したってバレる人にはバレる
どういうサービスかにもよるのでそこんとこ分からないとなんともいえないけどね
>>286 推測されてまずいことは多分あります
そのままmd5するわけではないのでまずばれないと思います
ひとまず速度だけが心配
あまり遅くなるようならCRC32とかに変えるかも
めちゃくちゃ速度低下するとしたら、どうするの?
・連番をMD5したものがユーザID ・ユーザIDは連番だけどMySQLに格納する際にMD5する どっちなのかが分からない
291 :
286 :2010/09/08(水) 17:23:16 ID:???
>>287 いろいろ知識不足で突っ込みどころ満載だけど聞かれたところだけ答える
それくらいじゃ全然問題ないからどんどんやればいいよ
そうするとMD5の計算はユーザ登録のときしか使わないわけだから、 主キーが4バイトから32バイトになることによる比較処理の負荷増と、 データ量が増えてメモリに乗らなくなるタイミングが早まるところが懸念点か。 それくらいなら気にしなくてもいいと思った。 MySQLのSQL構文解析処理の方が何十倍も重いと思う
オートインクリメント番号を暗号化する意味が分からない そんなもん知られただけでまずいシステムって… 負荷とか気にする以前の問題だな
たとえばmixiだとshow_profile.plに適当なID渡すとプロフ見れちゃうだろ? そういうことをできなくしたいんだよ 簡単に言うと
それはPK以外の部分でやるべき話だろう
そうだな。 システム内部で扱う会員IDはユニークな連番 会員自身が認識する俺IDはメアドでも何でも なんてのは珍しくもないだろうな。
俺初心者なんだけど
>>294 みたいなことをできなくしたい場合
IDを暗号化するのが簡単だと思うんだが
ならそれをキーとして使えば、連番なんていらないんじゃないの?
>>297 >>294 みたいなことができちゃうのはプログラムの問題でしょ?
それにmixiみたいにオープンなサイトなら見られてもいいから見せているわけで。
何が問題なの?
連番がかっこ悪いとか(32文字の暗号もダサいぜ…)宗教上の理由なら別だけど。
それでも暗号化・復号化できる自作のプログラム組んで表示の時だけ暗号化したほうが絶対いい。
mysqlにはオートインクリメントとという便利な機能がある。
それをわざわざ暗号化してDBにいれるなんてどうかしてるゼ!
そもそもどんなサービスなのかすら情報がないのに応えられないわ
隠したい、っていう答えで納得してやれよw 何だかわからないが隠したいIDは、PK以外でやるべきだ。 で結論が出てるし。
単に宗教なのかな Mysqlのオートインクリメントという便利な機能を使わないなんてどうかしてる! 自作のプログラム作ってエンコード&デコードするべきだ! ってのと 面倒くさいからキーを暗号化すりゃいんじゃね?無駄なコードは書かない主義 ってのと。 まあどっちでも好きにすればいんじゃね
>>299 >>291 ですでに答えてるように、質問の回答だけならすでにしてる
>>300 逆にどうやって現在の連番を取得するの?
連番の計算→それを暗号化
こっちのほうが無駄なコードな気がするけど
md5の負荷を気にするような、かなり大規模なシステムなら設計段階でしっかりやるべき
パスワードをmd5なら分かるけど、連番をmd5なんて主義とか以前の問題だと思うけどな
インストの段階で困ってるんだけど、どなたか相談に…。
サーバを一から環境設定していくのは初めての人間です。
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 がインストールできるでしょうか。
>>301 質問と関係なくコーディングに行き詰まったので出てきました、元の質問した者です。
レスくれた人たちありがとう。
作ってるのはぶっちゃけmixiアプリのゲームのようなものだと思ってください。
idの連番はこちらが作るのではなく、mixiのユーザーIDです。
それを引数に使ってDBアクセスだと、気を付けないと適当にID入れてごにょごにょ…
とかできると想定外のアクセスをされる可能性があるので
ユーザーIDを暗号化したものを引数にすればよくね?
ユーザーIDはユニークだから暗号化してもほぼ確実にユニーク→じゃあキーにすればよくね?
と思った次第です。
とりあえず速度に影響はなさそうなので、今回はこれで行く予定です。
もちろんこれ以外でのセキュリティ対策もしっかりやる予定。
AUTO_INCREMENTのIDとは別にユーザーID用Columnを用意すれば 解決できるよね?
307 :
302 :2010/09/09(木) 22:48:20 ID:???
>>305 なるほど、yumは楽だけど、あんまり更新されてないし、
融通が利かないのですよね。
とりあえずMySQL-server-5.0.87と合うPHPのバージョンを探してみます。
それからビルドしてmake installかな。
ありがとう。
>>306 うん、ってかどう考えても普通はそうすると思うんだがなぁ
select distinct a from table1 where b=c select distinct a from table1 where b=d 以上の、2つの文で、(aの値が)重複したものだけを、 結合して抽出したいのですが、どのように書けばよいでしょうか? できれば結合結果に、ORDER BY 'e' と LIMITも加えたいです。
>>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);
311 :
NAME IS NULL :2010/09/11(土) 18:37:55 ID:ijaraffT
大規模サイト向けのテーブル構造を勉強して実験したいのですが、 参考となる解説サイトってありませんかね? ちなみに大規模サイトというのは、 mixiのような不特定多数のユーザが利用するSNSのようなサイトです。
大規模SNSのテーブル設計は企業秘密じゃないかなあ OpenPNEでもダウンロードして覗いてみたらどう
昔、mixiサーバー不具合でソースが丸見えになってた時があったよね まあ今は全然変わってるかもしれんが
なんかの不具合でソース丸見えになる可能性ってあるの? Apacheでスクリプトがスクリプトとして認識されてないようなコンフィグのミスとか?
315 :
311 :2010/09/12(日) 00:07:18 ID:???
>>312 OpenPNEのテーブル設計はとても大規模向けとは思えないんですよ。
せいぜい100〜200ユーザーが毎日アクセスしていたら
レコードが肥大化してパフォーマンスが悪くなると思います。
データベースの分割やパーティショニングを効果的に使って
万単位の利用を捌いているような設計の情報って、ネットで探せなくて・・・
>>315 >万単位の利用を捌いているような設計の情報って、ネットで探せなくて・・・
探しかたが悪い。要素技術ならいくらでもある。
だが、要素技術だけマスターしてもどうしようもない。
レーシングカーでも飛行機でもロケットでもなんでもいいが多くの構成要素をもつ工学製品がどうやって作られているか、回り道のようでもいろいろ勉強してみろ。
要素技術ひとつひとつ完全にマスターするだけでなく、なにを選びなにを捨てるか、取捨選択=トレードオフ、全体のバランスをとるセンスを研くことがいかに大事か掴みとらないかぎり、大規模システムには手を出さないほうがいい。
ところで万単位って大規模か?
その勉強方法がわからないから、訪ねてるんじゃないの?
大規模サイトの開発・運用はいくつか本がでてるけど、 時期によって実際は最適解は変わってくるだろうから システム全体を疎なつくりにしとくくらいじゃないかな。 事前にやれることといったら。
>>314 見た目はそんな感じだった
mixi.jp/aaaaaa.plにアクセスするとPerlのソースがそのまま出てた
>>315 そういうのは企業秘密なのかなかなか情報ないね
技術セミナーとか出てみても質問してみてもうまいことぼかしてあって、具体的なことは教えてくれない
やはり中で働いてみるしかないんだろうな
そのくせ、求人は「大規模サイト構築経験」とかいうの多いんだよな。 どこも試行錯誤なんじゃないのかなあ。
Webサービスをやってる企業も手探りなのかな? pixivはオープン後、数日でアクセスが増えてデータが肥大化したから サーバ増強した?かなにか対策したという話を聞いたことある。 でも、こういう状態って運営経験無いとわからないよな。 自分達が作ったサービスが予想以上にヒットした時、 経験無いから対策できませんってなったら、せっかくの商機も失ってしまう。
商機を失ってしまう会社はやっぱりあるよ。 そのへんは大規模経験があるベンダと付き合いがあるかどうかじゃないかなあ。 別に大きなベンダでなくともそれなりの経験があるだろうし。 ホスティングサービスに相談して解決できてしまうレベルだったりもするかもしれない。
slideshareにアップされた大手サイトのドキュメント見てるけど、 それぞれ工夫していると言うのはわかるが、 具体的なテーブル構成や設計に関する事は書いてないな(当たり前かw 俺の中で意外だったのは、データベースを分けるのではなく、 テーブルを分けてレプリケーションする方法をしている方法が割と多かった
>>317 だから
マニュアル坊やは何やってもダメなんで大規模に首つっこむなっての
試行錯誤できないやつはなにやってもダメだが
きまった手順のな分野にはそういう奴はいらんわけよ。
つまり、自分で乗り越えられることが先端にかかわるための必要条件。
十分条件でないぞ。
第三者だけど、 A:マニュアルを見てきっかけを掴む B:自分で試行錯誤してきっかけを掴む では、明らかにBの方が効率が悪いぞ? 君は受験勉強で赤本買ったり、受験対策の過去問やったりしない?
マニュアルに載っているようなことはマニュアルを見なくても 脳内の引き出しから出てくるのは前提条件だろ。 その上で、ネット上に散在している要素技術を蓄積し、かつ それを必要な時に組み合わせて問題解決できることが求められてるんだよ。
自らの成功体験を語っているはずなんで全部正解だと思う。 ただ、命題からちょっとずつズレているだけ。 大規模だと普通は、Oracleとか使うだろ。l で、マニュアルに載ってない情報を教えてもらう流れ。
>大規模だと普通は、Oracleとか使うだろ。l これは違うと思う。
あ、そうなんだ。俺、引退して3年くらいたつからな。
引退ってお前何歳だよw
>>325 > 第三者だけど、
>
> A:マニュアルを見てきっかけを掴む
> B:自分で試行錯誤してきっかけを掴む
>
> では、明らかにBの方が効率が悪いぞ?
ゆとり乙
> 君は受験勉強で赤本買ったり、受験対策の過去問やったりしない?
教科書なんてない未開の分野に乗り出す人間と後からついてくる人間の違いがわからん奴になにいっても無駄だな。
大規模システムにきまり切った定石なんてない。みな一品もの。
スケールアップしか手がないシステムならそれでいくしかないし、スケールアウトできる切口があればスケールアウトすればいい。
トレードオフのポイントみつけるのは技術センスが必要。ダメな奴はダメ。ほんとうにセンスのアリ無し。
ただし大規模の設計センスがないからといって技術レベルが低いってことじゃない。
向き不向き。全体のトレードオフを見つけるのがうまい奴は得てして細かい実装には拘らないことがおおいから
実装者としては中級の場合もある。
質問者はとっかかりが掴めないといってるが、それは向いてないんだから別の方向を探したほうがいい。
別の道を歩きながら経験積んで大規模に立ち向かうセンスが身につくかもしれないし、
細部に拘った実装で名をあげるかもしれないし
Web前提で書いてるだろ。
Connector/Netっていつ頃から MySQL 5 以前を サポートしなくなったのですか? MySQL 4 に .net でつなぐ方法はありますか?
>>331 お前みたいな古い根性論の奴多いな。
「俺の背中を見て仕事を覚えろ」ってやつ?www
チームにとけ込めない人間ならそれで良いだろうな。
何が「一品もの(キリッ」だw
現実には定石はあるし、マニュアルも作ってる。
ただお前は知らないだけ。違うか?人に教えられる能力がないだけなんだよ。
>>334 >現実には定石はあるし、マニュアルも作ってる。
じゃあ、出してあげればw
根性論なんて、って言っているやつも分かって言ってると思う。字面みて、ちょっとカチンと来ているだけだろ。 枯れた技術は、抑えるのは当然として、新しいことやろうとすると、やっぱ工夫しないとダメだし。 すごく端的かもしれんけど、戦闘機を国産で作ろうとなったとき、既にアメリカにある技術だから、教えてもらえばいいってことにはならない。 同じように大規模でもサクサク動く何かを作ろうとしたときに、別の会社にノウハウあっても意味はない。 みんな正解を言いあって、ケンカしているのがホント解せないわ。 おまえは偉そうだから腹が立つ、って言わないと。そこは。
>>338 > 根性論なんて、って言っているやつも分かって言ってると思う。字面みて、ちょっとカチンと来ているだけだろ。
「現実には定石はあるし、マニュアルも作ってる。」なんて書いてる
>>334 が分かってやってるはずない。
>現実には定石はあるし、マニュアルも作ってる。
そのマニュアル出してみろよ。
そのマニュアル読めば素人でもDB100台規模のシステム組んで運用出来るんだろうな?
その定石ってのは、DB100台から1000台に拡張するときもなんの問題もなく適用できる定石なんだろうな?
そんなもんあるわけねえだろ。
多少失敗しながら自分で考えて技術身につけないと、100台規模から1000台規模になんて拡張できねえんだよ。
10倍のシステム拡張成功させた人間が、エッセンスを言葉でマニュアルに書いても、
それを本当に理解できるのは同等レベルのエンジニアだけ。そういうエンジニアは間違いなく膨大な時間を使って実験して
膨大な失敗をしている。失敗を話さないからスゲーって思うだけ。ものすごい時間を投資して勉強してんだよ。
マニュアル読めばできるなんて考えてる馬鹿が多いから、システム開発は上流から下流まで全部ボロボロになるんだよ。
おちつけよ、まぁもっとやれ。
>>339 そんなマニュアル会社の大事な財産なんだからこんなところで出すかよ アホか
おまえみたいに自宅鯖の前で唸ってるだけじゃないんだよ
>>341 > そんなマニュアル会社の大事な財産なんだからこんなところで出すかよ アホか
>>338 >根性論なんて、って言っているやつも分かって言ってると思う。
な、
こいつ 341=334 分かってないだろ
ちょっと煽ると本気になるってガキかよ
>>341 ,334
釣りや皮肉に
まともに反応されると
スレがつまらなくなるよ
>>341
344 :
NAME 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/でトップページへ行けるのでエイリアス等は通っていると思います 。
345 :
NAME IS NULL :2010/09/14(火) 22:56:45 ID:l/VJf2+2
LinuxにMySQL5.0.Xインストールしたんですけど、 InnoDBでできる0とか1とかのファイルって何でしょうか? 全く更新されてないようなのですが・・・。 /etc/my.cnfはほぼデフォルトのままです。
>>345 InnoDBのトランザクションログファイル
InnoDBのテーブル作ってINSERT/UPDATEしたら更新される
捨てちゃダメ
>>344 対応ディストリビューション:Red Hat Linux 9
ってすごいな。どんだけ更新されてないんだ
ファイルをUTF-8に変換して、UTF-8で動くように
自力で改造した方が早いかもしれない
348 :
499 :2010/09/15(水) 00:41:07 ID:???
数値型
349 :
499 :2010/09/15(水) 00:47:33 ID:???
初歩的な質問過ぎて逆にググってもでてこないから教えてください 数値型っていろいろあるけど、整数ならINT使うべきなんでしょうか? INT TINIINT SMALLINT MEDIUMINT BIGINT もちろん、INT型の範囲を超える値を使うなら BIGINTにするけど、TINYINTやSMALLINTはいらないコですか? それとも、テーブル設計時にサイズが例えば128桁未満で確定してるなら TINYINTのカラムにすべきですか? 話それるけど、Javaの場合、JVMが最適化してくれるから short型とか使わずに、int型で宣言した方が性能でるってのがあって MySQLとか各種データベースもそういうのあったりすんのかなーっていう質問です。
>>349 そのテーブルが何千万何億レコードにもなる/なりそうで、
とあるカラムに格納される値が1byteとか2byteで収まるのなら、
そして出来るだけディスク消費量を抑えたいのなら、
tinyとかsmallとかを使う。
百や千ていどのレコード数なら、あんま気にしなくてもいいよ。
351 :
344 :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で書き直してみます
なあ、「UTF-8対応」って要するに文字コードがUTF-8で保存されていればOKな話なの? スクリプト中に文字コード依存するような、例えばPHPだったらmb_encoding関数とか、 Perlだったらjcode.perlとか使ってるような処理がある時には修正するってくらい?
MySQL Clusterに関してですが、マネージメントノードを複数台にする設定方法など、参考URL等でもいいので教えていただけませんか? ネットにある情報みても、マネージメントノードは1台構成の設定サンプルしか見当たらなかったので。 よろしくお願いします。
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 というエラーに成ります
on *.*
>>355 grant file on *.* to testuser@localhost identified by 'testuser';
で出来ました。
有難うございます
DB作ってそのDBを更新するユーザを作りたいんだけど、 ユーザテーブルにユーザを追加して、権限をSelect_priv Insert_priv Update_priv Delete_privのみYにしたけど、 いろんなDBにアクセスできるしルート並に更新とかやり放題なんだけど、 どうやって使用するDB制限すればいいの? あと、権限関係の知識ないから簡単にチュートリアル的に説明してくれるサイトがあればおしえてほしい。
revoke all on *.* from testuser@localhost; grant all on test.* to testuser@localhost; あとはぐぐれ
>>358 行けたー、そしてググって意味も理解した。
サンクス。
phpmyadminで文字セット変えたくて $cfg['Lang'] = 'ja-sjis'; $cfg['DefaultLang'] = 'ja-sjis'; $cfg['DefaultCharset'] = 'ja-sjis'; $cfg['DefaultConnectionCollation'] = 'ja-sjis'; ってしたら 言語ファイルが登録されていません: ja-sjis って出たんだけど、どうすればいいかわからないから知ってる人教えて。 スレ違いだったらスマソ。 phpスレで聞くのも違う気がするし、どこで聞いていいのかわからない。
361 :
NAME 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ってでるだけで..... どなたか解決方法ご存じないでしょうか?
ダンプしてリストアすればいいような気がする
363 :
NAME IS NULL :2010/09/19(日) 22:20:21 ID:sGWKjnuL
>>362 早速ありがとうございます。でも
mysqldump: Got error: 1146: Table 'データベース名.テーブル名' doesn't exist when using LOCK TABLES
となってダンプできませんでした。
>>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に与える値は違うみたいだよ。
もちっと調べてみたら?
>>363 改行コードを合わせてないだけじゃ・・・
>>363 あの。。。。。。。
元のMac側でダンプするんだよ???
>>364 ダメでした。
$cfg['DefaultLang'] = 'ja-sjis';
$cfg['Lang'] = 'ja-sjis';
$cfg['DefaultCharset'] = 'SHIFT_JIS';
実は投稿前に一応、ja-sjis、sjis、SHIFT_JISと試してみたのですが、
どれも駄目だったのです。
>>368 サーバーの状況がまったく書かれてないね。
show variables like 'char%'; の結果と、my.cnf(あるいはmy.ini)のdefault-charcter-setの設定値くらい書かないと。
あと、skip-character-set-client-handshakeの設定をしたか?とか。
mysql workbench 5.2.28(ga)がリリースされたばかりだが、 サーバーインスタンスを作る画面で下部の情報が表示されないし startかけたら Could not start server: expected a character buffer object というのが出る。 5.2.27に戻すと、うまくいくのだが、本家、バグってないかい?
371 :
NAME IS NULL :2010/09/23(木) 12:31:57 ID:xYi5pgu4
372 :
NAME IS NULL :2010/09/24(金) 03:13:22 ID:QTcdf6KB
MySQL Workbech 5.2.28CE使ってます。 7個テーブルを作ったのですが、ForwardEngineerしても そのうち最初の3個しかテーブルが作られていません。 うまくいかない原因はどんなことが挙げられるでしょうか?
373 :
372 :2010/09/24(金) 03:29:59 ID:QTcdf6KB
自分でCreateTable文をコマンドラインからぶち込めばよかったのか。。。 ERROR 1005 (HY000): Can't create table 'mydb.log' (errno: 121) と言われます。 googleで調べると、外部参照の元と先の型が違うときのエラーのようですが そのような間違いは犯していませんでした。 どうしてなのでしょう?
374 :
372 :2010/09/24(金) 04:01:10 ID:QTcdf6KB
Edit SchemaでDB名を変えると、今まで問題の無かった enum文でもエラーがでるようになっちゃいました。。。 どうなってるんでしょうコレ。偉い人教えてください。
375 :
372 :2010/09/24(金) 04:05:18 ID:QTcdf6KB
>>374 の症状は勘違いでした。。。
頭が混乱してきた><
ディスク容量とか、大丈夫ですか?
>>373 「そのような間違いは犯していませんでした」って言ってもなぁ…
実際間違ってるからエラー食らってるんだろ。
参照する側される側、両方のshow create tableの結果を貼った方が話が早いんじゃ?
MySQL Workbenchの品質がちょっとアレなんじゃないの
379 :
372 :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 = 'ユーザーアカウント情報';
380 :
372 :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 = 'プロフィール情報';
381 :
372 :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 = 'ユーザー設定';
382 :
372 :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;
ほんとだエラーでた 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: セマフォがタイムアウトしました。
俺にはわからん。 解析班の到着を待とう。
385 :
372 :2010/09/24(金) 22:03:08 ID:QTcdf6KB
ちなみにMySQLServerはVer5.1です。
386 :
372 :2010/09/24(金) 22:36:13 ID:QTcdf6KB
CONSTRAINTをコメントアウトしたらうまくいった気がします。。。 まだ様子見ですが。。。
387 :
372 :2010/09/24(金) 22:45:36 ID:QTcdf6KB
CONSTRAINT名の重複をしないように書き換えたら、たぶんうまくいったみたいです。
Workbenchが勝手に作るSQLが、それらなんだ? つかえねーw 使ったことないけどw 名前を付ける仕組みがダメすぎるな。 でも`mydb`.`profile`のCONSTRAINT `user`だけ命名パターンが違う気がする なんでだ?
390 :
372 :2010/09/25(土) 02:48:25 ID:oJ/2I9fC
GUI上に、CONSTRAINT名を指定する欄が見当たらないんですよね。。。 なんかの理由で自動生成されてる気がします。
指定するところあったよ ER図でテーブルをダブルクリック → 下部に出たテーブル定義ペインでForeien Keysタブを選択 → Foreign Key NameがCONSTRAINT名に相当 いずれにせよSQLファイルにフォワードするときに Workbenchの方で一意性をチェックすべきだな
392 :
361 :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にて全て大文字のある元のファイル名に変更 これでなんとかなりました。 なんだったんだろ?
なんだったんだろって 十分正確に把握していると思うけど
395 :
361 :2010/09/25(土) 23:32:35 ID:KgxIgKBX
さらに面白い現象を発見
ほとんどinnodbにしてるんだけど、なぜかinnodbのくせに同名の.MYIと.MYDがあるテーブルがある。
こいつらは、そのまま読み込むことができるけど、renameができない。
ほんとになんなんだろ?
>>393 偶然見つけただけだから、把握なんてできてないよ。
396 :
372 :2010/09/25(土) 23:56:12 ID:???
>>391 profileテーブルだけは、その値が使われてないんですよね。。。
CONSTRAINT名は、参照先のテーブル名を使う、でも重複してたら
Foreign Key Nameを使う、という処理をしてるのかもしれないですね。
設計について質問です。よろしくお願いします。 MySQLとPHPを利用して、ある資格試験の過去問学習サイトを作成する予定です。 このサイトでは、ユーザー登録(ログイン)機能を設けて、ログイン中のユーザーには、 その人のこれまでの得点や各問題の正解率などを記録・表示できる仕様にしたいと考えています。 ユーザーごとに得点や正答率などを記録するには、一つのテーブルに、 各ユーザーごとのカラムを設けて、カラム単位でユーザーの成績などを 記録した方が良いのでしょうか? それとも、各ユーザーにつき、一つのテーブルを割り当てるのが良いのでしょうか? テーブルとカラムの設計のヒントをご教授頂けるとありがたいです。 なお、プログラミングについては、これまで掲示板などの作成経験があるくらいの初心者です。 よろしくお願いします。
399 :
397 :2010/09/26(日) 16:48:44 ID:???
>>398 すみません。
DB板の他スレを見たところ、過疎のスレが多いので、「MySQL総合」の
こちらで質問させて頂きました。
>>398 のスレも8月12日以降レスが無いので・・・。
「どっちもやらない」ということは、ユーザー管理のテーブル、成績だけのテーブルを使って、
テーブル間で結合などの処理をするのが適切なのでしょうか?
会員毎にカラムなんて、ましてやテーブルなんて作らないすよ。 >ユーザー管理のテーブル、成績だけのテーブルを使って、 >テーブル間で結合などの処理をするのが適切なのでしょうか? そんな感じが普通だと思う。例えばあくまで一例だけど。 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 // 正解したか否か ) とか。 正解率は都度計算で出すか、 正解率みたいな集計値の記録テーブルを設けるか…
401 :
397 :2010/09/26(日) 18:20:36 ID:???
>>400 ありがとうございます!!とても参考になります。
正規化やリレーショナルな操作が苦手なため
考えがもやもやしていましたが、目の前の霧が晴れました。
400様の教えを元に試行錯誤してみたいと思います。
本当に感謝です。400さん398さんに幸ありますように!
InnodbおんりーのDB鯖立てなきゃなんですが、 実メモリ内に収まる範囲で運用できてるかどうかがわかりません… 簡易チェックツールとかありませんかね?
MySQLのレプリケーションって、サーバをRAIDしているようなもんだと 思っているのですが、認識的に正しいですか?
うーん自分のなかでそう理解するだけならいいけど その認識で他の人に説明するといろいろ誤解を招くと思う。 RAID1は同時に両方に書くけど レプリケーションはマスタに書いた後スレーブに書くから、 マスタが壊れるタイミングによってはスレーブに欲しいデータが 存在しない場合がある、といったところが違う
すみません。 Aというテーブルに、ユーザーのメールアドレスをクエリにしてデータの照会を行い、 受け取った配列をBというテーブルにINSERTしたいと思っているのですが \"$row[id]\",\"$row[pass]\"という風にしてSQL文を発行しても、Bに挿入されません。 print_r()で見てみると "","" のようにデータが空になってしまっています。 以前、似たようなケースでやった時はデータを入れることができたのですが…。 どのようにすればテーブルBにデータを移せるのでしょうか?
>>405 MySQL関係ないやん。
$row[id]が実は無いとかでなければ"{$row[id]}"で展開できる。
てか文字列は""じゃなくて''で囲ったほうが面倒ないよ。
あとSQLハードコードするならヒアドキュメントのがすっきり書けるよ。
407 :
NAME IS NULL :2010/09/28(火) 07:24:37 ID:XeiSxRUI
>>405 PHP?知らないし、今回の件と直接関係ないけど
プリペアードステートメントとかプレイスホルダを
調べると(まわりの人が)幸せになれると思う
408 :
405 :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側の問題のようなのでそちらで質問します。
どうもでした。
>>408 プレースホルダとか使うのが間違いないけど、""内に直接変数書かないようにしたほうがいいんでない?
query ok とかってのの表示するしないの変更ってできませんか? 大量に登録するとき表示で時間かかったりするんですが
表示で時間がかかる??? ありえんだろ。 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");
コンソールへの出力は、するとしないとで速度が全然違うよ。 (ディスク上の)ファイルに出すのは、あまり速度の足引っ張らないんだけどね。
ひょっとして、1行ずつのInsertで大量登録、つーことか・・・
414 :
NAME 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 マシンです。
整数にしようってのがアレな気がするけど、 まあ、DECIMAL?
ポスグレだと、ネットワークアドレスデータ型っていうのがあるんだね。 MySQLは、そういうのはないし、整数変換の inet_aton は、ipv4のみサポート。
417 :
NAME IS NULL :2010/10/01(金) 07:38:00 ID:xMdr0/PC
特定のテーブル(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' に対して許可されていません 、らしいのですが、 よく分りませんでした。 どうすれば特定テーブルだけにアクセスできるユーザを作れるのでしょうか?
419 :
418 :2010/10/02(土) 08:39:15 ID:???
失礼しました。 grant権限の無いユーザで、grantしてました。 orz
初歩的なことですが、教えてください。 VARCHAR(32) PRIMARY KEY DEFAULT NULL 上記が通らないのですが、なぜ主キーをつけると VARCHARにはDEFAULT NULLがつけられなくなるの でしょうか。 PRIMARY KEYによりNOT NULL制約がつけられている ので、ここに値を入れない限りはエラーになる (insertやupdateはできない)というカラムにしたい のですが、ご教示いただけますと幸いです。 よろしくお願いします。
俺も初心者ですが。 primary key は、NULLが認められていない default null は、NULLが認められていないカラムには設定不可 ダブルでNG >なぜ主キーをつけるとVARCHARにはDEFAULT NULLがつけられなくなるのか varchar だからダメっていうわけでなく、上記理由でNG intでもダメだし 最後の文の意図がまったくわかりませんでした。 読み取れるところから、 >insertやupdateはできない 別のdatabaseに表を作って、select権限のみgrantすればいいんじゃないですかね。 参照専用のなにか仕組みがあるんだろうか?
422 :
NAME IS NULL :2010/10/03(日) 08:28:21 ID:9zQ6kT+B
>>421 >>420 さんが理解できるでしょうか?
PRIMARY KEY の要件を無視しているお話しだったので、理解してもらえないと私は思っています。
もしくは釣りだったかもしれません。
423 :
420 :2010/10/03(日) 15:16:54 ID:???
すみません。 釣りではなく素で質問させていただきました。 主キーは絶対にNULL以外を入れなければいけないのにも かかわらず、DEFAULT NULL制約をつけるということが矛盾 しているのはわかるのですが、このカラムに何も指定をしな いでINSERTをかけると、空文字が入ります。 これを防ぎたいと思い質問させていただいたのが趣旨と なります。 プログラム側で、間違えて主キーカラムを指定しないで INSERTをしてしまった場合、DB側でエラーにしたいの ですが、無理であればプログラム側での制御にします。
その空文字はNULLではないでしょう。
もしかしてこれか? ・DEFAULT 値は定数でなければならず、関数や式を使用することはできない。 DEFAULT 値が指定されていない場合、そのカラムには、次の方法で、MySQL によって DEFAULT 値が自動的に割り当てられる。 値として NULL を取れるカラムの場合、デフォルト値は NULL になる。 NOT NULL として宣言されているカラムの場合、デフォルト値はそれぞれのカラム型によって決まる。 PRIMARY KEYはNOT NULL→だから暗黙にDEFAULT '' だとしたらひでぇw もし空文字列がキーとして不要なのであれば、CHECK制約ではじくとか。
MySQLはCHECK制約ないよ
428 :
NAME IS NULL :2010/10/03(日) 16:18:15 ID:9zQ6kT+B
>>423-424 > このカラムに何も指定をしないでINSERTをかけると、空文字が入ります。
空文字とNULLの違いをご存知だと言う前提でレスします。
検査制約( CHECHK でしたっけ? )を使えば良いと考えました。
けれども、MySQLでは、検査制約は可能なのでしょうか?
手元にマニュアルが無いので適切に回答できなくてスマソ
primary keyをセットした時点で重複は弾かれるけど、 id varchar(10) not null default '' primary key これだと、最初の1レコードのみは主キーが空文字で登録できてしまうね。 要するにid bigint unsigned auto_increment最強。
430 :
420 :2010/10/03(日) 16:25:29 ID:???
皆さま。 ありがとうございます。 状況としましてはおっしゃるとおり、PRIMARY KEYはNOT NULLで あるため、自動的にDEFAULT '' が適用されてしまうことの対応策 を教えていただきたく、書き込ませていただきました。 空文字で入ってしまいますと余分なデータが入ってしまうためです。 現状のサーバ設定を崩すことはできないため、なんとか教えてい ただいたことを参考に試行錯誤してみたいと思います。 取り急ぎ、御礼申し上げます。
431 :
424 :2010/10/03(日) 16:48:58 ID:???
>>428 >
>>423-424 >
> > このカラムに何も指定をしないでINSERTをかけると、空文字が入ります。
>
> 空文字とNULLの違いをご存知だと言う前提でレスします。
>
おれもかよw
>>427 列制約としては指定できたんじゃなかった?
バージョンやストレージエンジンによって違うのかも知れんけど。
指定できて、コマンド通るけど、制約違反を華麗にスルー
MySQLにおいてDB接続時間の設定を行うにはどうすれば良いでしょうか? 具体的には、PHPスクリプト内でDB接続を行った後に close漏れがあったとします。 この場合に、DB切断コードの実装漏れがあったとしても 連続で5分以上DB接続状態が残っている場合には、 自動で切断する様にしたいです。 可能であればGUI(phpMyAdmin)上で設定出来るのならしたいです。 ※現在は、サクラインターネットの共有サーバを想定しています。
interactive_timeoutっていうパラメータで設定できるけど、 共有レンタルサーバでは無理なのではないか
436 :
NAME IS NULL :2010/10/04(月) 18:17:23 ID:RNbuW/Kd
interactive_timeout wait_timeout 現在の、この2つの値を教えてください。
>>436 さくらのレンタルサーバなので分りません。
phpMyAdmin動くんならわかるだろ
PHPか。 色々MySQLに繋ぐのはあるだろうけど、少なくとも基本のmysql_connectあたりだと、 別に俺やあんたが書いてるPHPのコードでわざわざcloseしなくてもいいんだけどな。
自称中級者によくある「たぶん原因はコレだろう」だろ 大体は全然間違ってる
MySQLで再帰SQL相当の処理ってどうやって実現してますか? ストアドに頼るしかないのでしょうか。
connect byで、ツリー型の再帰 withで、再帰呼び出しができる
あ、ごめ MySQLのスレだった
>>443 間違い
MySQLでは、uniqueにした場合、大文字小文字の違いはどうなりますか?
ぐぐれかす
selectがおかしいです。 select * from hoge where a = 'あ'; とすると、 |"あ" |"hoge" | null | |"あ" |"hohi" | null | ... って感じで出力されるはずなんですが、 | |"hoge" | null | | |"hohi" | null | ... って感じで"あ"のとこが押しつぶされて出力されてしまいます。 何がどうなってるんでしょうか...?
MySQL 文字化け でググってみてください。
449 :
447 :2010/10/05(火) 19:55:33 ID:???
>>448 load data infileで読み込んでるんですが、
文字コードはsjisでそのとおりにしてるつもりなんですが…
450 :
447 :2010/10/05(火) 20:01:35 ID:qhtr8KRl
そのとうりですね。させん
その「とおり」
452 :
447 :2010/10/06(水) 09:13:23 ID:KYR4QbWd
というか「あ」で、"は無かったです。 けど押しつぶされるのはよく分かりません…
で、ググった結果、どんな風に調べて、文字コードは問題なしと判断したのか聞きたいところ。
454 :
447 :2010/10/06(水) 22:58:58 ID:KYR4QbWd
文字化けというか、 出力しながら消えていってる?みたいな感じなんです… |あ |hoge | NULL | と出力されてるのに、 次の行を表示する瞬間(?)に、 ||hoge |NULL| |あ | hogi| NULL| みたいにさっき確かに表示されてた「|あ |hoge」のとこが 圧し潰されます。
ファイルにリダイレクトしてみりゃいいじゃん
キャリッジリターンが入ってるんじゃね?
このコマンド結果は、どう?
>>447 set names sjis;
select c,hex(c),charset(c),'あ',hex('あ') from テーブル;
cは、変な出力するカラム名。
1行分だけでいいです。
なにっ! set names sjisで解決だと・・・
459 :
447 :2010/10/07(木) 16:30:14 ID:KrND0SBh
>>457 正しく出力されます。
あ 82A0 sjis あ 82A0
です。
複数行にしても正しく出力されるんですが、
なんかselect * from tableだと
変な出力になります。
460 :
447 :2010/10/07(木) 16:33:21 ID:KrND0SBh
ファイルへ出力も問題ないです。 なんか表示するときだけ変に…
>>459 ということは、文字化け つーことで決着ですな
変な出力するところを先のhexで見てみないとわからないね。
出力されたファイルの文字コードは?
463 :
447 :2010/10/07(木) 20:24:13 ID:KrND0SBh
464 :
447 :2010/10/07(木) 20:28:38 ID:KrND0SBh
NULLのあとに、すぐカーソルが元の位置に戻って、スペース、|、ってなった後に 改行してるってこと?みたいですが…. キャリッジリターンってのはどっから入ってきてるのか
>>464 プログラムで、¥n置換してないかぃ?
そこで¥rも置換すればよいんじゃないかな。
466 :
447 :2010/10/08(金) 03:42:06 ID:FtAvuyFN
>>465 正規表現で\nを含めて変換したことはあります。
けど、バイナリエディタで見ても0D0Aの改行が
あるだけなんですが…
______ ___________ V _____ /::::::::::::::::::::::::::\ _ /::::::::::::::::::::::::::::::::::::::\ /  ̄  ̄ \ |:::::::::::::::::|_|_|_|_| /、 ヽ はぁ?黙ってろデブw |;;;;;;;;;;ノ \,, ,,/ ヽ |・ |―-、 | |::( 6 ー─◎─◎ ) q -´ 二 ヽ | |ノ (∵∴ ( o o)∴) ノ_ ー | | /| < ∵ 3 ∵> \. ̄` | / ::::::\ ヽ ノ\ O===== | :::::::::::::\_____ノ:::::::::::\ / |
すみません、教えてください。 select column1, column2 from table; という結果に、任意のcolumn1, column2を先頭に予め追加して おきたいのですが、方法はありますでしょうか。 もしありましたらご教示いただけますと助かります。 よろしくお願いします。
469 :
468 :2010/10/12(火) 01:09:20 ID:???
なんだか説明が下手ですみません。 上記は、固定文字列を予め先頭に入れておきたいということです。 よろしくお願いいたします。
470 :
468 :2010/10/12(火) 02:31:43 ID:???
unionで自己解決しました。 すれ汚しすみませんでした。
説明に自信がないときは、簡単な例を示せばいいと思うよ。
ちょっと教えて下さい。 とある下請けが使う簡単なシステムを作ってるのですが、 以下のようなテーブル(いくつか省略)で作っています。 部品テーブル ・部品ID ・部品名 受注テーブル ・部品ID ・受注日 ・受注数 ・売価 ・納品場所
うんうん
474 :
472 :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 "
475 :
472 :2010/10/12(火) 14:01:11 ID:???
すみません、最後の行の ORDER BY " は消去し忘れました。
■Query1 SELECT 部品テーブル.部品ID, 部品名, 売価, SUM( 受注数 ) AS 合計受注数, ( 売価 * SUM( 受注数 ) ) AS 総売上額 FROM 受注テーブル INNER JOIN 部品テーブル ON 部品テーブル.部品ID = 受注テーブル.部品ID WHERE 受注日 LIKE '2010-09-__' GROUP BY , 売価
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"
Query1とQuery2を実行して、 部品名 | 開始在庫 | 今月の入庫 | 合計受注数 | 売価 | 総売上高 | 繰越在庫 を求めています。 今結合について勉強していて、1つのSQL文で全てのデータを呼べそうな気がしているのですが、 複雑すぎて泣きそうです。 教えてほしい事 ・外部結合を使って、1つのSQL文で全て呼び出せますか? ・できるようでしたら、そのSQL文を教えて下さい。 ヒントだけでも頂けるとありがたいです。お願いします。
最初の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 繰越在庫
480 :
472 :2010/10/12(火) 15:25:19 ID:???
複数の受注がある中で、受注日は無視して売価ごとにまとめているのでGROUP BYでまとめています。 部品IDとは別に部品名を呼んでくる必要があるのでJOINしています。 一つのSQL文にすることは無理なのでしょうか…。
いあ・・・ Query1の意義は、あなたの業務に意義はあるのでしょうが・・・ 今回、Query1の結果をQuery2にて、使用するという要件に関しては、idしか要らんと言ってます・・・ >一つのSQL文にすることは無理なのでしょうか・・・ 俺が伝えたことを試してみたのでしょうか・・・
482 :
472 :2010/10/12(火) 16:15:19 ID:???
すみません、今やっています。 MySQLのメッセージ: #1054 - Unknown column 'q6.i_id' in 'where clause' と言ってきています。
結合条件は、外に出さないといかんね。
484 :
472 :2010/10/12(火) 17:17:27 ID:???
ん…。
>>479 > idだけselectしたものをq5の後にくっつけて、結合
上記の結合というのがよく分かりません。
JOINは外してIDだけSELECTする文をq6として後ろにくっつけました。
外部とはどういう意味ですか?
485 :
NAME IS NULL :2010/10/12(火) 17:57:51 ID:AHwRH/dq
MySQLのMYDファイルってどういう形式で保存されて読み込まれてるの? MYDファイルが数百MBでもSELECTがすぐ帰ってくるのはどうやって実装されてるんだろう
>>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 開始在庫
他も同様に変更
>>486 あ、分かっていると思うけど、
FROM句で、
(select distinct 部品ID from 受注テーブル) AS IDS
これは、
(SELECT 部品ID FROM 受注テーブル WHERE 受注日 LIKE '2010-09-__') AS IDS
っていう意味。
例としてはどっちでも同じ、つーことで。
488 :
472 :2010/10/12(火) 20:08:30 ID:???
>>486-487 SELECT句の中にサブクエリを作るんですね、こんなの初めて知りました。
やってみますと、それっぽい答えが返ってきました。感動です。
正しく呼び出せているかチェックしてみます。
490 :
472 :2010/10/14(木) 09:51:00 ID:???
欲しいデータが正しく呼び出されている確認が取れました。 本当にありがとうございました。
491 :
447 :2010/10/14(木) 15:38:17 ID:???
最近「そんな***で大丈夫か?」ってのが流行ってるらしいね
447って何でも2chで解決していそうだな。 そんな貴方で大丈夫か?
495 :
447 :2010/10/14(木) 22:20:45 ID:???
load dataのときにload data local にするだけでした
質問!○月以前を呼び出す時は、必ず日付まで指定しないといかんの? SELECT * FROM table WHERE date <= '2010-10-31' 今はプログラムで最終日を求めよるんやけど、 日付を省略する方法があったら教えてー。
>>496 SUBDATE('2010-11-01', INTERVAL 1 DAY) じゃあかんの?
なんだLAST_DAYってのがあるやん マニュアル読む癖を付けようね
MySQLのシステム要件の記述が見つからない。 Oracleは見つかるんだけどね。 Linuxで使う場合のSwap、/tmpの必要容量について知りたい。 どっかにないかなあ。
>>498 おお、ありがとー!つまりこういうことやな!
SELECT *
FROM table
WHERE date <= LAST_DAY('2010-10-01')
どの月でも01日入れておけば、プログラムであらかじめ計算せんでもええんやな!
>>499 とりあえずOracleと同容量確保しといたら足りるよ
まあ、そりゃそうだろうねw。
Oracleってインストールめんどくせーってイメージしか無いわ。 OSのカーネルパラメータも弄ったりした覚えがある。
mysqladmin pingでエラーがでる csvファイルも取り出せない。どうやればいいのですか?
∧_∧ (´・ω・) 知らんがな ノ^ y丶 ヽ_ノ==|ノ / || """~""""""~"""~"""~"
コマンドプロンプトで '> がつづいて SQL文が打てない症状ってどうすればなおるんだっけ?
507 :
NAME IS NULL :2010/10/16(土) 08:43:12 ID:lodDPI8n
再起動してください。
>>506 '> ならシングルクォートをもう一発打てばいいし
">ならダブルクォート
で、\cで抜ける
フィールドの照合順序(collation)を一括して変更するにはどうすれば?
MySQLってストアドとかあるの? また、OracleとかならSQL Developerを使用してストアドをデバッグ実行とかする事が 出切るんだけどMySQLにそういったデバッグ可能なIDEとかってありますか?
>>511 MySQLはバージョン5からストアドプロシージャをサポート
>>512 デバッグ出切るIDEとかってありますか?
むりむり
そーいうIDEを作ったら売れるかな?
あんまり売れないんじゃないかなあ
DBをインポートしたら、collationがlatin1_swedish_ciに設定されてしまうんだが、 一括してutf8_general_ciに変更する方法って無いかな?
2chで質問するしか能の無い奴には無理
>>517
>>518 で、おまえにゃできるの? できるかできないかだけでいいからレスしてくれ。
やり方は別にいい。自分で調べる。
www
>>519 俺は出切る。お前のおつむじゃ無理だがなwww
できないわけないよねー
環境系?の質問って答えづらい。 自環境の状況、書かないやつは、もちろん 事細かに書くやつも、逆になんでそれで直らんの?と思うし。 チェック漏れとか、こっちにはわからんしなぁ がんばって自分で解決するしかないよ。
524 :
NAME IS NULL :2010/10/19(火) 22:31:29 ID:ZErapWl9
InnoDBの主キーって、クラスタインデックスで、リーフブロックにテーブルのレコードをすべて持つって聞きました。 ということは、主キーのサイズはテーブルのサイズより大きくなるんでしょうか。
まったく...驚いちゃうよな 未だに「MySQLはおもちゃ」なんて戯言を恥ずかしげもなく口にしちゃう脂ぎったオヤジどもがこの世に数多存在するってんだから 世に存在する全てのデータはMySQLをもって管理される 世に生まれる全ての創造物はMySQLに収納される これが何を意味するかわかるかい? これから生まれる全てのものがMySQLそのものだってことだよ まあ確かに禅問答だって言われれば否定はできないな でも考えてみなよ君の名前はどこにある?どこかのサーバーのどこかのディレクトリにインストールされたMySQLの中だろう MySQLに名前が存在しない人間など存在しない 生後間もない赤ん坊は別として 名前がMySQLにあるってことはだ...うんそうそう、そうなんだ、聡明な君ならもう分かったと思う 名前があればそこに君が「在る」んだよ 君の存在はそこに「在る」んだ だからそれはつまりこういうことだ ------ペニーオークションは詐欺じゃない
mysql開発のお勧めツール教えて欲しい
開発ツール? MyPenniesQL ペニーオークションで落札しろ
なんだこいつ
超初歩的な事を聞いて申し訳ないんですが、最近レコード数が多くなってきて検索が遅くなってきており インデックスを利用したら早くなるというのを知りました。 しかし、いくつかの例を見てもインデックスはテーブルを作成する段階で作るのが普通のようで、自分のケースの様に だいぶレコードが増えてしまってから、インデックスを導入するという事は難しいのでしょうか?
>インデックスを利用したら早くなるというのを知りました。 どんだけ馬鹿なんだよ
僕もそう教わりましたよ
禁書目録のことでしょうか?
インデペンデンス
>>530 >だいぶレコードが増えてしまってから、インデックスを導入するという事は難しいのでしょうか?
MySQLに対して「インデックス作れ」というコマンドを与えるのは簡単。
やり方はcreate index なり alter table なりでぐぐればよろし。
しかし、何をインデックスにするか適切なカラムを選べるかどうかとか、
そういうこと考えてなかったとすれば、もしかしたら適切なカラムが無い
ようなテーブルだったりの可能性も皆無じゃないし、その点が大丈夫
でもレコード数がちょー多かったら、インデックス作成にはけっこう
時間かかったり。
とかで、簡単な作業とは言い切れない。
でもあっさり済んだりして。
536 :
NAME IS NULL :2010/10/20(水) 21:41:07 ID:kndrTlqd
>>525 ありがとうございます。
なるほど、テーブルと主キーのインデックスが一体化しているんですね。
InnoDBのテーブルに対して、LOAD DATA LOCAL INFILEで大量のデータをロードする場合、 下記の1.と2.では、一般的に2.のほうが作業時間が短くてすむのでしょうか。 1.既存のテーブルに対してそのままロードする。 2.一旦既存テーブルのセカンダリインデックスを削除して、ロードして、セカンダリインデックスを再作成する。
>>537 MySQL 5.1までなら1の方が速い。
MySQL 5.1+InnoDB Plugin、MySQL 5.5なら2の方が速い、かも。
実際にやってみよう
なんで「セカンダリ」インデックス限定? とりあえず、loadするデータがユニーク制約や外部制約に触れないものと判っていたら、 既存テーブルそのままよりはload前にそれらの制約外しておいた方がいいよ。
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件 わかりにくいかもしれませんが よろしくお願いします。
>>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);
でどうか。
542 :
540 :2010/10/21(木) 09:49:57 ID:???
> 541 早々に有難う御座います 今夜帰ったら試したいと思います またカキコします
ご意見聞かせて頂きたいのですが、 大カテゴリ、中カテゴリ、商品 以上のテーブルがあった場合、 商品テーブルに、大カテゴリと中カテゴリのリレーションを持たせるべきでしょうか? 大カテゴリに含まれる中カテゴリ内の商品を全て取得したい要件があります。 それとも、商品テーブルには、中カテゴリのリレーションのみを持たせ、 大カテゴリ、中カテゴリ、商品と連なったリレーションを利用すべきでしょうか?
商品テーブルにはカテゴリ持たせずに、 陳列テーブルに大・中・商品を入れる。 ホーム・キッチン用品でも、アウトドア用品に含まれるモノもあるだろうし。
MySQLテーブル上に VARCHAR(100) と定義している項目に あいうえお ・・・ 10バイト と登録した場合、90バイト分は常に確保されてしまっているのでしょうか? oracleとかなら大目に定義したとしても自然に使用されていない部分は 端折られたと思うのですが如何でしょうか?
>>545 あまり詳しくないけど、
varcharは可変長だから端折られる。内容量+アルファ程度だったかな。
固定長なcharなら確保されてるかと。
ちなみに、mysql5.0からだったか、varchar(100)は100バイトじゃなく100文字になった。
547 :
NAME IS NULL :2010/10/22(金) 13:56:44 ID:a2nHdPCr
すっごい初歩的な質問なんですが 小数点第3位四捨五入できる(5/3の計算で1.67を出力する) 関数ってありませんか? (PHPで言えばnumber_formatです。がPHPは使用できません) 第3位切り捨てでもOKです。
マニュアル読んでから質問しようぜ
>>546 ありがとうございます。
無駄に容量を食っていたんじゃないかと
あせってました。
>> 538
>>539 ありがとうございます。
> なんで「セカンダリ」インデックス限定?
主キーは残してそれ以外は削除する、という意図でした。
主キーまで削除してしまうと、暗黙の主キーが設定されるらしいので、
それを避けたいと思いました。
>>543 >>544 データの関係性を説明せずにテーブルの設計を質問する質問者に、
それを確認せずに勝手な想定で回答する回答者。
DB板のよくある光景。
質問失礼します。 現在OSWIN7にMySQLをダウンロードしてインストールする際に InnoDB Tablespace Settingsという項目が空白になってしまい、選択ができません。 何かファイルを消してしまったようです。これを復活させる方法はないでしょうか?
ヒント句ってどういう用途で使うのですか? またMySQL(5.0)ではどのように使うのですか?
オプティマイザが決定した実行計画が意図通りでなく期待通りのパフォーマンスが 出なかった時に、特定のアクセス方法を強制する場合などに使う。 今はそういうものがあるとだけ覚えておけばよい。必要になる頃には調べ方もわかってるはず。
MySQL5.0(UTF-8)を使ってますが 「〜」、「@」、「U」、「p」、「−」などなどなどなど 環境依存文字を含む多くの文字・記号を含むデータのinsertがはじかれてしまうのですが。 webのform上からpostしたら大丈夫だったので 何かinsertの方法に不備があったのかなと思っています。 情報足らずかもしれませんが何かわかるかたいらっしゃいますでしょうか。
Windowsのコマンドプロンプトからinsertしようとしてるのかと 予想するくらいしかできんね。
557 :
NAME 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 怒られる おねがい教えて><
559 :
NAME IS NULL :2010/10/27(水) 15:01:44 ID:krhumVm4
text型のフィールドから正規表現に一致するデータのみを取り出したいのですがどうすれば可能でしょうか?
例)
http://example.com/** (**はフィールドによってまちまち)
下記でtextを全部取り出してperl,phpなどのプログラムで該当するURLを取得するくらいしか思いつきません。
select text from hoge where text like '%
http://example.com/% ';
変な質問で申し訳ないのですが、ご教示お願い致します。
URLが必要ならテーブル設計が悪いんじゃね? アクセス頻度にもよるけど、テーブル格納時にバラしておくものかと
563 :
NAME 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を小文字で書くべきとか 大文字小文字を区別しないのはわかるのですが コードを書くときどうするべきでしょうか?
自由にすればいい。 昔はSQLはすべて大文字で書くのが普通だったが。
>>561 ありがとうございます。
URLを含むカラムを取り出すこと自体は既にできています。
ただできたらURLだけを取り出したいと思ってましたがどうも無理っぽい(不可能ではないですが、プログラムまわしたほうがよさそう)ですね;;
>>562 設計というより、サービス終了するサイトの画像URLがフィールドで使われているので使われている画像のみ新しい画像サイトに移そうと考えてます。
かなり特殊な事例だとは思います;;
某オンラインゲームのサーバ別情報サイトを扱いたいのですがサーバが5つあります サーバ別にテーブルを用意すべきか カラムにサーバ名を入れることでテーブルを統一するかで悩んでます アプリケーションの実装的には後者のほうが楽なのですが のちのちレコード数が増えることを考えると速度面で前者にしといたほうがいいのでしょうか? 合計して1日10000件のデータの追加もしくは更新を見込んでいます 放置しておくとデータが増える一方で検索速度にも影響が出ると思うのですが 定期的に古いデータを削除もしくはデータとして蓄積だけ行う墓場のような場所に移動すべきでしょうか? データを残して削除フラグだけ立てる方法もありますが レコード数が変わらないので速度的にはどうなのでしょう?
カラムにサーバ識別子入れるのが教科書通りの設計 個人サイトなら遅くなったらその時点で設計見直せばいいと思う
そんな場当たり対応をしたくないから最初の設計で悩んでるんだと思うけど
分割したってせいぜい5分の1にしかならないんだから意味ないよ。 気になるならメモリ5倍積めばいいよ
570 :
566 :2010/10/29(金) 00:11:42 ID:???
>>567-569 ありがとうございます
たいして変わらないということでいいんですね?
確かテスト用レコードを何万件も提供してるようなサイトがあったような気がするので
探して本番環境とは違うしアクセス数も考慮しないのであまり参考にはならないですが
一応自分のPCで検証してみたいと思います
カラムにサーバ名を入れることでテーブルを統一しといて5台のサーバでcluster 処理追いつかなくなったら、サーバ追加 運用当初は削除はフラグにしておく 容量足りなくなるか、削除データが負荷になるようなら ログ用DBサーバ用意してarchive engineにする みたいに、場当たり的じゃなくてちゃんとスケールを考慮した設計しとけばいいんじゃないの?
5.1のパーティションでテーブル内でサーバー毎に分けるとか。
すごく初歩的な質問だと思うのですが、、、 1億件ぐらい入っているテーブルに、20万件ぐらいのデータを定期的にインポートしているのですが データを PRIMARY KEY の項目で予めソートしておいたものはロードの時間が短く ソートしないものは長い、ということに最近気づきました。 ソートされていないと、PRIMARY KEY で作成される INDEX の更新に時間がかかるのでしょうか?
574 :
NAME IS NULL :2010/10/29(金) 23:37:12 ID:HzUTuPtD
warning でも die するようになる方法はないでしょうか?
576 :
573 :2010/10/30(土) 07:53:31 ID:???
>>575 ありがとうございます。分かりやすい資料でした。
InnoDB ではなく MyISAM ですが、共通する要因があるのでしょうね。
PRIMARY KEY ではなく INDEX KEY のみの場合は、未ソートデータのロードで
それほど処理時間の増大が見られないということは、UNIQUE 制約による処理が
影響しているのでしょうか。
大変参考になりました。
MySQLで大量データのDB設計するのに わかりやすい、おすすめの書籍やサイトってありますか? 運用や実際の操作より設計に重点を置いたものがいいです
結局試行錯誤
そこをなんとか
設計っつてもな。 物理設計なら、半分は運用や実際の操作がかかわってくるし。 論理設計なら、MySQLとか限定する必要もないし。
大量ってどのくらいのデータ?それにも依るんじゃない 数10G、数100G、Tバイト? あとどんな使いかたするDBなのかも重要じゃね?JOINしまくりなのかテーブルなめまくりなのか 予測しとくと「Tバイトに近いデータをどんな複雑な条件でも超高速に検索したい」とかの無理難題
データ量って件数じゃなくてDBのサイズに依存するのか?
松信嘉範氏の本が良さげ。
>>584 かなり危ないですね。知らせてあげましょう。
うわあ・・・俺は踏まないけど でもこういうのアクセスしても不正アクセスになるんじゃないの?
ユーザーにパスワード設定してないのかな 酷いね
>>586 踏んだけど、別にこれなら不正アクセスにはならんと思う。
一般公開してるもんだ。
Googleに載ってるってことは、ここへのリンクをどこかに書いておいたわけか。二重の失態だな。
phpmyadminって、専用のディレクトリを作って、 .htaccessでアクセス制限した上で、更にmyadminの パスワード設定をして使って、用が済んだらその都度 消せと教わったけど、今は公開が普通なの?
これって個人サイトでしょ
もう数年前になるけど、レンサバでも他ユーザのスケルトン丸見えってのがあったぞ。 さすがにDBにはアクセスしなかったが、サバ屋に電話して対策されるまで1週間程かかってたな。 phpで作ってるからなのか、設置する側のセキュリティに甘さが見える時があるよ。
592 :
NAME 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
593 :
NAME IS NULL :2010/11/01(月) 18:48:30 ID:hFBJdldW
全文検索をやってみようかと思い、sennaを調べていたのですが、wikipedia に 「新たな開発は事実上終了しており」 とあったんですが、日本語の全文検索はどういうやり方が現在主流なのでしょうか? Namazu? 私の情報はちょっと古すぎて・・。
>>593 現状でいえばまだsenna(tritonn)でいいんじゃない?はてなでも使ってるらしい。
後継はgroonga。でも、まだmysql用のストレージエンジンは開発中で実用には程遠いとのこと。
>>589 自分はhtaccessでIPアドレス制限で使ってる。
IPアドレス変わったらSSHでhtaccessを書き換えてる。
596 :
NAME IS NULL :2010/11/01(月) 20:19:48 ID:hFBJdldW
>>594 そうなんですね。ありがとうございます。
じゃあ senna(tritonn) を試してみよう。
597 :
NAME 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のバージョン等 いろいろ変えてみたがダメ。 分かる人いない?
VirtualBoxでCentOSインストールして、C + MySQLでプログラム組もうとしてるんですが、 PHP + MySQLならネット上にも書籍でもたくさん資料あるんですけど、CとMySQLだとあんまり情報なくて困ってます どこを見て勉強するのが良いでしょうか?
オライリーのMySQL本にCの接続サンプル例が載ってた ちと古いけど
接続した後はやることは同じだもんな。 mysql(クライアント)のソースでも覗いてみては。
603 :
NAME IS NULL :2010/11/03(水) 18:13:05 ID:ZhMqIH4k
forkへの本格的な移行時代到来!
移行するならMariaDBかな?
それ誰か使ってるの?
名前が厨二すぎる
切るも何も、おまえらMySQLのサポートなんて使ってないだろ。
なんでわかった!!!!
サポート切りって別に開発中止に繋がるようなものでもないじゃん。。。
木構造のデータをいくつも保存したいのですが 何か方法ないでしょうか?
XMLはimportする方法あるんですね
MariaDBってネーミングはヤメてほしいよな 娘がマリアなんだっけ? 本筋のforkかもしれんが、このネーミングはナシだ
今じゃ普通だがよく考えればMySQLってネーミングも・・・
Myも娘の名前だからな 娘を金持ちのおっさんに寝取られたようなもんだ
嫁いだと考えよう きっと姑にいじめられるんだろうけど
そうはいっても、ブサイクな娘マリアのお世話になるかもしれんのぜ?
綺麗な姉ちゃんに育ったマイは嫁に行ったよ ブサイクでforkなマリアは行くあてが無くてね、父ちゃんと二人暮しさ
長男は独立したのか?マックスくんは
質問なんですが、 20kB程度の画像データとそれに伴うせいぜい大きくて20文字程度の メタデータ10種類くらいをデータベースで管理しようとしたとき 以下の3つのうちどれがいいと思いますか? データ件数は最大1000万件、メタデータに関してはwhere節や order byを使って自在に検索したいとします。 A.全部ひとつのテーブル B.メタデータと画像データを別テーブル C.メタデータはデータベースで、画像データは画像ファイル
>>619 バイナリ突っ込んで文字コード変換なんかでぶっ壊されて以来
俺はバイナリファイルはファイルとして置くようにしているな。
突っ込んだほうが良い事例があったら俺も聞きたい。
base64エンコしてテキストとして書き込むとか 多少データ膨らむけどね
624 :
619 :2010/11/05(金) 15:27:21 ID:JLrTiqr7
回答サンクス
>>620 ,622
画像ファイルを1000万個扱うことに
問題があるかなと思ってCはちょっと怖いんだけど
大丈夫かな。
ファイルシステムはext3。
>>624 一箇所に置くのはきつそうだね
俺はルールベースでフォルダわけて置いてる
1フォルダあたりなんとなくなんだけど
2000ファイルくらいになるように調整して
626 :
619 :2010/11/05(金) 15:41:26 ID:???
なるほどー 2000ぐらいずつフォルダにわけて ファイルで管理するのが正解なのかな。
>>626 20k程度の画像ならDBに突っ込む方があきらかに管理の手間が減る。
1000万個って結構多いねー
629 :
619 :2010/11/05(金) 18:27:58 ID:???
>>627 管理はたしかにDBがラクかもですね。
管理のラクさ A>B>>>C
信頼性 C>B>A
速さ C>B>>>A
って感じなのかなあ?
ファイルにしてもNFSとかに置いちゃうと激遅だから気をつけた方がいいよ バイナリ破壊は、壊れない方法を一旦確立すれば大丈夫。 その件数だったら俺なら 別テーブルにして file_per_table して更にパーティショニングしちゃうな
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 の指定も付けています
よく見れ、クライアント側のキャラセットだろ。
633 :
631 :2010/11/05(金) 23:41:33 ID:???
ここらへんが全然判っていないところだと思うのですが、、、、、 要は出力をcp932で出したいのですけどね character_set_system utf8 だからsystemの方は utf8だと んでクライアントの方は cp932ですよと じゃぁ dump出力時の --default-character-set=cp932 はどういう意味が?
>>619 サービスの規模によりそうな気がする。
俺ならBを選ぶかなー
他のデータも乗ってくるなら、スキーマごと分けて、
いつでも画像スキーマだけ別箱に移せるようしとくとか。
Cは安定と信頼の実績
Aはもし速度とか問題になってリプレイスするときダルそう。
635 :
619 :2010/11/06(土) 11:47:14 ID:???
>>630 NFSの予定でした(汗
データサーバが別サーバのとき
C案を使うとしたらNFS以外どういう選択肢があります?
ftp?scp?samba?
パーティショニング勉強してみます。
>>634 不特定多数に公開するものではないので
サービス規模は大きくないです。
>Aはもし速度とか問題になってリプレイスするときダルそう。
実は今がその時だったりして(^^;
チューニングを最低限しかしてないので、
リプレイスが決定したわけでもないんですが。
>>635 元レスの意図がわからんが、NFSでいいんじゃね?
その際、画像データサーバをDBサーバにぶら下げる(DBからのアクセスに限定する)のか、
クライアントから直接アクセスさせるのかは、
パフォーマンスとアクセス権管理のし易さとの見合いで。
638 :
NAME 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
これは難題だ・・・ゴクリ
where name like 'abcde%' ではどうか
641 :
638 :2010/11/07(日) 00:06:55 ID:???
遅くなりましたが、自己解決してしまいました。 csvを作成した際に、文字列をダブルクォーテーションでくくったのが問題のようでした。 文字列はくくるものという自分の中での常識が間違っていたようで申し訳ないです。 どうもお騒がせしました・・・
643 :
619 :2010/11/07(日) 00:16:30 ID:???
>>636 勉強にはなったけど、むりぽw
>>637 元レスは一度に大量の画像ファイルを
読むことを言っているのかもしれませんね。
一度に読むのはせいぜい30個くらいだから、
NFSで問題ないかな。
>>638 そのSELECT文はコマンドプロンプトから
打ってるのかな?
自分自身も原因は把握してないが
サーバの環境(インスコ時のコンパイルの仕方?)
によってはコマンドプロンプトでutf-8使えなくね?
phpやらなんやらでutf-8使ったクエリ出す分には
問題ないんだが。
ver 5.1.41 os XP テーブル作成時にカラムに付けたコメントってどうやったら削除できるんでしょうか?
alter table テーブル名 modify column 列名 データ型等 comment '';
>>645 有難うございます。コメントの削除ができました。
647 :
NAME 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をかけばよいでしょうか? ご教示いただけると幸いです。
648 :
NAME IS NULL :2010/11/08(月) 12:50:11 ID:CgV29jGv
初歩的な質問かもしれませんがお願いします。 ユーザがどのDBに対してどんな権限を持っているのか分かるようなコマンドはありますか? select * from mysql.user; とやってみたのですが、それらしき項目がなかったので・・・ MySQLのバージョンは5.0です。
select * from mysql.db;
ありがとうございました!
651 :
NAME IS NULL :2010/11/09(火) 02:19:15 ID:XUvSW9tK
>>637 同意。
バイナリをDBに格納するなんて基地外。
コネクション長時間握られてあっという間に飽和するぞ。
転送時間を考えるべし。
652 :
NAME 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 原因が分かりません。お願いします。
>>652 mysqldump を実行するとエラーになるの?
それともリストア時にエラー?
654 :
653 :2010/11/09(火) 16:02:30 ID:???
ごめん リストアって書いてあったね リストアはどうやったの?
655 :
NAME IS NULL :2010/11/09(火) 16:34:25 ID:gRZ7qjVv
>>654 リストアは
mysql -u user -p < mysqldumpで作成したファイル
で行っています。
656 :
NAME IS NULL :2010/11/09(火) 16:37:51 ID:gRZ7qjVv
>>652 です
受け手と送り手のバージョンが逆でした。
もしかしたらBTREEは5.0では使えないのでしょうか?
そうでしたら回避方法はあるのでしょうか?
657 :
NAME IS NULL :2010/11/09(火) 17:07:46 ID:gRZ7qjVv
>>652 です
5.1でmysqldumpされたCREATE文の USING BTREE の
位置では5.0でエラーになることが分かりました。
この回避策はあるのでしょうか?
バージョンを合わせるしかないのでしょうか?
659 :
NAME IS NULL :2010/11/09(火) 18:02:49 ID:gRZ7qjVv
>>658 ありがとうございます。
参考にします。
660 :
619 :2010/11/09(火) 18:14:37 ID:???
>>651 他
みなさんありがとうございましたm(_ _)m
素人なんで勉強になりました。
C案で決定でやることにします。
質問です。 NOW()やUNIX_TIMESTAMP()は、 FOR UPDATE等のロックで待たされた場合、 SELECTを仕掛けた瞬間と、待ちが終わってSELECTが実行できたときと どちらの時間を返しますか?
どっちか知りたいなら試してみりゃいい。 ただし、決まっているとは限らんけどな。
663 :
661 :2010/11/10(水) 22:42:16 ID:???
>>662 おっしゃるとおり。時間ができたら試してみます。
べ、別に誰か既に試したなら教えてくれてもいいんだからねっ!
664 :
661 :2010/11/11(木) 02:14:24 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);
肝心の出力処理の部分を書きなさい
667 :
665 :2010/11/11(木) 22:15:43 ID:???
>666 失礼しました。 両者とも$row[0]や$row[1]です。 前者は echo $row[0]; 後者は print <<< HTML <h2>$row[0]</h2> HTML; このあたりの違いはありますが・・・
データベースの容量が大きくなってしまったので、 ローカルで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くらいの削減になるようです。 そこで質問なのですが、どれくらいずつやるのが良いと思いますか? よろしくお願い致します。
669 :
668 :2010/11/12(金) 07:34:03 ID:???
>>668 です。
mysqli関数ではなくmysqlidクラスで、INSERTO INTOではなくUPDATEでした。
よろしくお願い致します。
OPTIMIZE TABLEは20万行全部終わってから1回だけ実行するんだと思う
あとプログラムで1行ずつやるよりは、こうしたほうが速いと思う。 CREATE TABLE temp AS SELECT id, SUBSTR(description, 0, 200) FROM entry; DROP TABLE entry; RENAME TABLE temp TO entry;
672 :
668 :2010/11/12(金) 10:23:24 ID:???
>>670-671 ありがとうございました!
笑っちゃうくらいすぐに完了して感動しました。
インデックスを含め700MB→230MBに削減できました。
教えていただいたSQLではインデックスやauto_incrementを含めて
複製することができないようだったので、
「SHOW CREATE TABLE entry;」の結果にAS以降をつなげてみました。
MySQLのSUBSTR関数は先頭が0ではなく1のようです。
思い切って質問してよかったです。
本当にありがとうございました。
673 :
668 :2010/11/12(金) 10:34:50 ID:???
>>672 です。
正しくインデックスが張られていなかったようでした。
「SHOW CREATE TABLE entry;」の結果のカラム名「description」を
AS以降のSELECT文で使うSUBSTR(description,0,200)に変えたところ上手くいったみたいです。
最終的に700MB→330MBになりました。
以上、失礼します。
674 :
NAME 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です
>>674 1)
その$dbとやらは、
SQLがエラったときちゃんとthrowするようになっているか?
なんかフレームワーク使ってるならいいんだろうけど、
素ならデフォでは投げてくれないぞ。
2)
参照より更新のほうが負荷が高いし、
ロック(FOR UPDATEとか)をするケースなども考えれば
普通は参照→更新。
今の金額をSELECT;
if( 取得した金額+足す予定の金額<1000 ){
足すUPDATEをする;
}else{
echo 入金エラーです
}
書いてから消しゴムかけるより、ふつう見た時点でダメなら書かないだろ?
あと不安だから1)に補足しておくけど、
auto_commit=0なりbeginなりstart transactionはしてるか?
途中でわざと絶対エラーになるクエリを発行して、
ちゃんとロールバックされてるかのテストとかするんだぞ。
676 :
674 :2010/11/12(金) 14:39:08 ID:MYvcRYh8
>>675 すみません、かなり省略して書いてしまいました。
推測の通り、frameworkで作っています
1)もちろん、例外をthrowします。また、starttransactionも実行しています。
try{}中でcommit()されるということは、クエリが全て成功したと考えて良い訳ですよね?
2)そうですね、query()の前に確認した方が良いですね。ありがとうです
>>676 クエリはすべて成功したと考えてよい。
ちなみにこれも老婆心だとは思うけど
UPDATEは更新対象が0行でも正常終了するから気をつけて。
678 :
NAME IS NULL :2010/11/12(金) 15:53:03 ID:CCE9XiI6
>>647 どなたか教えていただけると嬉しいです><
>>647 難しいなぁ。
サブクエリ側で同じkey内のランダムな行をなんとかして
EXISTSでなんとかしてできそうな気がしたけどやっぱわからん。
>>647 ,6
ORDER BY rand()を利用すればできるかもしれないけど、全件走査になるだろうしな。
件数が少ないならプログラム側でなんとかなるだろうし、件数が極端に多くなったらIDを
乱数で発生させて適度に抜き出したほうがいいだろうし。
乱数ソートはインデックスが効かないんだから、SQLでなんとかするよりもプログラム側で
なんとかするほうがいいでないかの。
>>647 解決法は分からないんだけど・・・
差し支えなければ、どういう用途で使用するのか教えてくれる?
682 :
665 :2010/11/12(金) 16:53:46 ID:???
>665,>667です。 どなたかわかりませんでしょうか?(´・ω・`)
>>682 とりあえず両者とも、クエリ発行直後の時点でechoなりログ吐くなりしてみたら?
そこの時点で同じなら、その後の処理になにかあるんだろう。
>>647 ちょっとイカサマくさいが、どうでしょか?
select
(select id from test where `key`=m.`key` order by rand() limit 0,1) id
from
(select distinct `key` from test)m
;
685 :
NAME IS NULL :2010/11/13(土) 21:15:04 ID:CaiJLbhU
最近データベースに画像を保存できると知りました。それで、テーブルの扱いについて質問です。 例えば同じサービスに日記と料理レシピの紹介機能があってそれぞれ写真をUPできるとき、 1)写真データは専用の写真テーブルに入れるべきでしょうか? 2)それとも日記テーブルとレシピテーブルに写真用カラムを作って入れるべきですか? 1)の場合、登録時も引き出し時にトランザクションの負荷が発生するし、 2)の場合、ユーザごとの合計アップロード容量を算出する時手間です どうしたら良いでしょうか 合計容量の算出なんて各ユーザの管理画面でしか不要だから2)が正解でしょうか それとも第3・第4のテーブルを使って効率的に実装する方法があるんでしょうか どういう風に作るとどんな面で利点がある、という形で意見貰えると嬉しいです 初心者過ぎてDB設計の留意点などわからないので漠然とした質問になってすみません よろしくお願いします
ユーザの立場を想像して言うと、一枚の写真を日記とレシピの両方に 使いたい場合もあるだろうなぁ、とか思うんだな。
>>685 >1)の場合、登録時も引き出し時にトランザクションの負荷が発生するし、
ここがわからん
別テーブルにすると更新も読み出しも負荷が高くなるって意味?
個人的には画像は無理にDBに入れんでも
ファイルでいいんジャマイカと思うが
688 :
685 :2010/11/14(日) 08:51:54 ID:OQDjesf5
>>686 ありがとうございます。確かにそうですね〜!
「日記の記入と一緒に画像UP」の他に「既存の画像アーカイブから選んで日記に貼りつけ」の
機能も必要ですね
>>687 あ、引き出し時はトランザクションいらないですね
でもjoinが発生するんでしょうか
>別テーブルにすると更新も読み出しも負荷が高くなるって意味?
はい、トランザクションとかjoinとか、そういうものが少しでも発生しないように
作った方が良いのかなと思いまして…
画像を普通にファイルとして保存する場合、利用ファイル容量の計算難しくないですか?
(PHP使ってるんですが… 任意のディレクトリ以下のファイル容量を
再帰的に取得できる関数があるのかな〜)
DBに画像登録なら、ファイルサイズも保存出来るからSUMで一発解決かなーと思いました
画像自体はファイルで、そのデータだけDBいれときゃいいようなー
>トランザクションとかjoinとか、そういうものが少しでも発生しないように なんで瑣末な事をやたらと気にするのかね
>>687 少しでも負荷を軽くしたいのならファイルで扱ったほうがいいと思うけどな。そもそも画像データ
そのものは検索対象にならないんだし。
>画像を普通にファイルとして保存する場合、利用ファイル容量の計算難しくないですか?
ファイル名と一緒にサイズも登録しておけばいいだけじゃないの。
692 :
685 :2010/11/14(日) 12:14:08 ID:OQDjesf5
>>689 なんか初耳です。データだけってのはどういうことですか?
ファイル容量のデータ(100kbとか)のこと?
>>690 大した負荷じゃないんですかね?
トランザクションもjoinも最近おぼえたので「なんか大層なことをしてしまってる」ような
気がしてるんですが。
>>691 >ファイル名と一緒にサイズも登録
これは689さんの言ってることと一緒でしょうか? そういうことですよね?
容量計算用のテーブルにファイルサイズを入れる、と。なるほど…
>>692 >トランザクションもjoinも最近おぼえたので「なんか大層なことをしてしまってる」ような
>気がしてるんですが。
そりゃやらない場合よりはオーバーヘッドはあるよ。
ただ、それらをなるべく使わないようになんてのは、RDBを使う旨みをなるべく捨てようと
してるようなもんだわな。
まあとことん高負荷なサービス運営しようと言うところなら、一部その旨みを捨ててでも
システムへの負荷を下げるという技を使ってるかもしれないけど、こんなとこでこんなの
聞いてる人が作るものなら、先々は分らんが当面はそういう話は関係無いでしょ。
まずは実装の細かいとこでの効率なんかより、素直な設計のちゃんと動くものを作り
上げることを考えた方がよろし。
>データだけってのはどういうことですか?
画像データは普通のバラのファイルとして格納しといて、
そのファイルの情報(パス名とか)だけDBに入れておくってことだと思う。
694 :
685 :2010/11/14(日) 14:14:27 ID:OQDjesf5
>>693 あーなるほど、わかりました! ありがとうございました
695 :
NAME IS NULL :2010/11/15(月) 10:36:42 ID:s7bzgzBD
画像はシステム的に破綻をきたしやすいよ。 DBにいれると例えばWeb側から画像表示となった場合、 (ローカルサーバにDBない前提だが) ネットワーク越しにMySQLのポートを長時間つかむことになる。 ローカルでも同じことだけどね。 データ量がテキストの比じゃないからね。 俺も昔管理のしやすさを期待してそうしたけど大変なことになった。
DBに入れて初回アクセス時に適当なディレクトリにコピーを作っておいて、二回目以降はそちらを参照。 一定時間が過ぎたらディレクトリから削除。 毎回DBから取得はキツいでしょ
ぶっちゃけ、分散ファイルシステム(WindowsのDFSみたいな)を使うのがいい。
Webの場合画像のデータURIスキームを納めればいいんじゃないの その文字列をimg srcにつければリクエスト数も減るしお得
デカいデータを取り出すのが遅いとかそういう話してるんじゃないのか データURIスキーム使ってもそこは一緒じゃん
2つの開発環境でdescのdiffを取っていて気づいたのですが、 片方ではあるビューのDEFAULT欄に元テーブルのカラムのDEFAULT値が 表示されるのですが、もう片方ではNULLとなります。 他にも片方で0000-00-00 00:00:00、もう一方でNULLになる箇所などがあります。 ビューのDEFAULTの欄なので、実質的な違いはないのですが、 これって仕様なんでしょうか? それともバージョン違いのせい?(5.0.22と5.0.45) できれば両方とも同じ表示になるようにしたいのですが、 ビュー再作成ではダメでした…
データベース設計について相談させてください。 クーポンサイトの情報をWebapiから取得して、DBに登録したユーザーごとの 条件にマッチすればメールでお知らせするプログラムを作っています。 現在、 usersモデル、 alertkeywordsモデルと二つあります。 一人のuserは複数のアラートキーワードを作成できます。 この時、 ”同じクーポンを重複して同じメールアドレスに送らないようにしたいです。” WebAPIからそれぞれのクーポンのIDが取得できるので、 新たに couponsモデルを作成し、 couponID、date、email、と3つのテーブルを作成。 アラートメールを送信したクーポンのidはcouponsモデルにデータを保存する。 毎回アラートメールを送信する前に、このモデルで以前にメールを送信したかどうか チェックするというやり方を考えたのですが、これよりもっと綺麗なやり方は あるでしょうか? (わかりにくくて申し訳ありません。指定していただければ説明を追加いたします。)
「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を使っているように見えます。
703 :
NAME IS NULL :2010/11/17(水) 10:18:08 ID:6fPf9rex
into outfile 無しで標準出力にcsvファイルを吐き出す方法を 教えてください。
>>702 LAST_INSERT_ID()は引数付きで使うと
引数の値をLAST_INSERT_ID()の値に設定して、その値をそのまま返す
mysql_insertidはLAST_INSERT_ID()の値だから、結果的に
mysql_insertid = LAST_INSERT_ID() = id+1 となる。
705 :
NAME IS NULL :2010/11/17(水) 11:42:45 ID:BzgNGBOJ
>>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)が同じ値になることはない、という理解でいいでしょうか。
>>707 ありがとうございます。ぜんぶドキュメントに書いてあるんですね。出直してきます。
709 :
NAME 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番目にデータがある事を認識出来ていないようです。 これにはどのような原因が考えられるでしょうか? 宜しくご教示下さい。お願いします。
710 :
NAME 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)を使用しています このような場合どこに問題があるのでしょうか? わかりにくい質問で申し訳ないですが、よろしくお願いします。
そりゃphpmyadminがそういうふうに作られているんでしょう
713 :
NAME IS NULL :2010/11/18(木) 19:18:12 ID:7RuA6Gxf
暗黙のコミット 当たりの問題じゃないかと予想
714 :
NAME IS NULL :2010/11/18(木) 19:28:08 ID:Cf2TFxy8
>>711 すいません、自分へのアドバイスでしたらよくわかりません(709?)
急に会社命令で学ぶことになったので
>>712 phpmyadminではROLLBACK;は使えないのでしょうか?データの復元とか
できないのでしょうか?
プログラム上から、もしくは専用のGUIツールからならわかるが phpmyadminからトランザクションはれるってあんまりイメージ沸かないな、 できないんじゃね?知らないけど。調べれ。
716 :
NAME IS NULL :2010/11/18(木) 19:49:50 ID:Cf2TFxy8
>>713 暗黙のコミットって初めて聞きました。検索したらトランザクションが
勝手に終了されると・・・関係ありそうなのでもう少し調べてみます。
>>715 実際の現場ではphpmyadminでトランザクションはつかわない
みたいなんですね。
717 :
NAME 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になっています。 書籍にはコミットせずに終了すると自動的にロールバックされると書いてある のですが、コミットされてるようです。 上記のような時は何が原因なのでしょうか?
varchar型で1万文字以上格納できるようなんですが、 text型と使い分ける目安はどの程度なんでしょうか? varcharに入るなら全部varcharに入れてしまった方がいいんでしょうか? 入力される値は0文字から4000文字程度と仮定。 MySQL-5.1.37でInnoDB使用。
719 :
NAME IS NULL :2010/11/19(金) 14:46:57 ID:VrwkXLqe
すみません、717のコマンドプロンプトの質問はデータベースの指定ミスでした。。。
720 :
NAME IS NULL :2010/11/19(金) 20:45:33 ID:lhdsvAaN
>>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 値は設定できない。
722 :
NAME IS NULL :2010/11/19(金) 22:11:09 ID:VrwkXLqe
>>720 エンジンがMyISAMのままでした。お恥ずかしい・・・
なんでかな〜と結構考えてイライラしたんですけど、でも解決してMYSQLが
少しおもしろくなってきました。
phpmyadminでトランザクションやロールバックがうまくいかないのは
まだ解決してないですけど
>>721 ありがとうございます。
挙動の違いはだいたい理解できました。
あとは、パフォーマンスの違いと、
どう使い分けるのか、それとも一方に統一した方が楽なのかがイマイチ分かりません。
725 :
NAME IS NULL :2010/11/19(金) 22:59:27 ID:FsIBdfpB
1つのページを表示するまでに発行されるクエリーの回数って100回くらいなら問題ないよね?
726 :
NAME 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 |
727 :
NAME IS NULL :2010/11/20(土) 01:12:02 ID:nLvBHSFA
>>726 各々、left outer joinしたものをunion allするしかあるまい
片方は、必ずNULLになるわけだし。
729 :
726 :2010/11/20(土) 01:57:35 ID:???
>>728 ありがとうございます!
今まで遭遇しないタイプだったので、結合だけで、
なんとかできないか試行錯誤してましたが
UNION ALL で目的が達成できました!
730 :
NAME 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にならないみたいです。
このあたりが問題なのかな?
MySQLでswap出たら開放されないのって仕様かな?
ずっと前に、メールアドレスはREVERSEで反転して登録すると、 インデックスとして使うときにいいって記事読んだ覚えがあるんですが、 ソースが見あたりません。 このテクニックについて参照できる記事をご存じのかたや、 またご意見があるかたはお聞かせいただけないでしょうか。
えらくクセのある運用方法だな 一概にいいとは言えないはずだけど・・
たしかにBTREEだったら逆のほうがよさそうだね。 おもしろいw
あまりに初歩的な質問で悪いんですけどデータベースの初期化って mysql_install_db ですよね? OSはCentOSなんですけど、一度yum remove (ryでアンインストールした後、もう一度入れても初期化されてくて 上のをやってみても初期化されてないのですけど、初期化のやり方間違ってますか?
>>735 既存のデータベース/テーブルが存在する場合は、一切それらに手をつけない
旨公式のリファレンスに書いてあるハズだが・・・。
yum で removeっても、/var/lib/mysql 下はクリアされないハズなので、
rm -rf で一旦消しましょう。
(もちろん、以前に作成したユーザーや権限は全て失われるので、
失いたくなければ他所にコピーするなりする)
>>736 レスありがとうございます。
公式のどこを見ればいいのかわからない程の初心者でして。
スレ汚し失礼致しました。
あー確かに メールアドレス逆のが効率は良さそうね 確かにおもろいw
Macの各アプリなんかの環境変数(?)は開発者サイトのホスト名を逆にしたようなものをキーにしてるのは、同じようなもんなのかな? defaults write com.apple.xxxx true みたいな。
>>732 ドメインで範囲検索する場合は有効かも知れんけどね。 like 'ten.hc2.%' とか。
そうでなけりゃ、めんどくさいうえにキーの分離が悪くて効率落とすだけ。
何にしても要件次第。
データベースの管理に、MySQL GUI Tools を導入したんですが セットの MySQL Queru Browser ではテーブル内の日本語データが 文字化けしてしまいます。 出来ればこの純正SETを使いたいので、日本語対応させたいのですが 何か方法はありますか?
>>741 EOL(=メンテ終了)って書いてあるのに何で無視するかな。
素直にworkbenchを使え。
innoDBでINSERT IGNOREやINSERT ON DUPLICATE KEY UPDATEをしたとき、 行が増えていないのにオートインクリメントが繰り上がってまう。 すぐIDがパンクするんだけどこれって何とかならないかな。
workbenchって使いにくくない?最近は変わったのかな、入れてみよう。 俺もquery browser使ってる。日本語は入れないようにしてるor必要なときだけ他のクライアントで。
workbenchってカラムの変更出来る? テーブル内データだけしか操作出来ない気がするが。 あとはQUERY入力
俺もworkbench一度入れたけど、クエリブラウザ的な使い方がわからなくて 結局クエリブラウザ使ってる。
正直使いやすいとはあまり思わないし、重いのだけど 単なるクエリ実行から、GUIでテーブル作成/変更したり ユーザーの管理もできるようになってる utf8でしか使ってないけど、日本語も問題なさげ。 最近MySQLを使うようになったから クエリブラウザと比べてどうというのはわからん
WinでNavicat Liteしか使ってねーっす
>>743 INTEGERで溢れるならBIGINTにすりゃいんじゃね?
750 :
NAME IS NULL :2010/11/24(水) 22:15:21 ID:JnCRimrA
ストレージエンジンにInnoDBを使っています。 あるテーブルやインデックス用のファイルの情報(ファイルサイズとか)を mysqlクライアントから知る方法はあるでしょうか。 Oracleでいうdba_data_filesのようなものがあるとうれしいのですが。
>>749 ありがd
なんで解決策がどこにもないんだよ……orz
とか思ってたら、誰も解決の必要性に駆られなかったのね。
BIGINTにすれば毎秒1億件更新してカウンターを釣り上げても100年は余裕だったのか。
>>750 SHOW TABLE STATUS\G
空のテーブルをOPTIMIZEする意味ってありますか?InnoDBのテーブルです。
>>753 TRUNCATEして空になったテーブルなら意味ない。
DELETEして空になったテーブルなら意味ある。
>>754 なるほど、理解できました。ありがとうございます。
稼働中のMySQLに入っているデータを全文検索する必要があり、 その方法を探しております。 ネットで調べると、trittonというプロジェクトが見つかったのですが、 MyISAM限定のためトランザクションが使えないようです。 全文検索とトランザクションを両立出来るような方法は無いでしょうか? mecabというフリーのエンジンがありますがこれをMySQLのデータと連携させることなどは可能ですか? 全文検索を実現しているWebサイトはたくさん見かけますが一般的にどのように実現されているのかを知りたいです。
>>756 MeCabは以下のいずれの方法でも必要。それ単体でMySQLの全文検索はできない
# MySQL 5.0系
MyISAM + Tritonn用のDBを別に立ててレプリケーションのスレーブにする
全文検索時参照用DBとしてアプリ側で接続先を制御
# MySQL 5.1系
mysqlftppc mecab plugin を使う
これも「まだ」MyISAMしか対応してないはずなので、れぷり(ry
人柱になるならgroongaストレージエンジン(5.1系)
クエリのテスト見る限り、トランザクションは使えない様子
全文検索用にテーブルつくって、マスタ文書の更新、挿入時に
そっちに放りこむようにしてもいいんじゃないかな
758 :
756 :2010/11/25(木) 19:26:18 ID:???
>>757 とても貴重な説明ありがとうございます。
こういう情報はネットで集めるのはなかなか難しいですね。。
レプリケーションにするのは自分には少しハードルが高いので
全文検索用のテーブルを別に作る方法で行こうと思います。
759 :
NAME IS NULL :2010/11/25(木) 22:53:37 ID:tKFy4xSJ
>>752 ありがとうございます。
Data_lengthを見るんですね。
誰かMySQL Clusterの設定方法とか詳しく書いてるサイト教えて。
topコマンドを叩くと、mysqldのCPU使用率が常に140%程度になっております。 (load averageは常に6〜8程度) 原因としてはやはり重いクエリが実行されている可能性が高いのでしょうか? スロークエリログを取りたいのですが、mysqld実行時にオプションを付けて起動しないといけなかったようなのでログを取ることが出来ません。 どのように調査を進めればいいのかアドバイスを頂けないでしょうか。
オプションつけて再起動すればいいじゃないか
>>762 実稼動中で今さら再起動できませんコッソリ対処したいんです
っていうことだろ言わせんな恥ずかしい
再起動しても数秒クエリが止まるだけで不整合にはならないし それでシステム全体が不具合でるならそれはそれで堅牢性がやばい。 とりあえずshow full processlistで秒オーダかかるクエリは見えるから explain付けて再実行してみたらいいよ。
InnoTopとかツールを入れて、クエリを全部とって、 それぞれexplainして実行計画を見るとか。 まぁCPUがそんだけ上がるのはほぼ間違いなくINDEX使ってない重いクエリだろうね 後は無茶な件数のソートか。
766 :
NAME IS NULL :2010/11/28(日) 02:00:34 ID:bvaFGsGN
統計解析関係の関数が無くて困ってます 助けてください。 いいリファレンスは無いですか?
mysql 5.1.38 mysqldumpで差分バックアップとかって出来ます?
>>767 出来ないのでは?
差分ならバイナリログかな?
>>768 ありがとです。
そちらの方を少し調べてみます。
このツールの質問はこちらでよろしいでしょうか? SQLyog trial -MySQL GUI v8.71 を使って、特定tableを正常な文字で表示したいのですが、 DB内に「・ト」「・・ツ」「・B」と言った化けた文字が出てしまい、 まともに何が書いてあるか分かりません。ここに貼ると形が変わってしまいますが、黒塗りの「?」のような文字だったり、♀だったりします。 おそらくlatin1の文字だと思うのですが、 このように化けてしまった文字を編集する方法はありますでしょうか?数値の欄なので、これらの文字は 何かしらの数字を表していると思います。
稼働中のMySQLのあるテーブルのカラムにインデックスを付加したいのですが、 単純にcreate indexを実行するだけで良いのでしょうか? 自分の認識では、インデックスとは索引テーブルを持つことだという認識なので、 どこかのタイミングでそのテーブルが作成されなければならないと思うのですが、 create indexを実行した時に索引テーブルも作成されるのでしょうか? create indexを実行した直後から、インデックスの効果が現れると考えて間違いないですか?
>>771 >単純にcreate indexを実行するだけで良いのでしょうか?
Yes
>create indexを実行した時に索引テーブルも作成されるのでしょうか?
Yes (「索引テーブル」とは呼ばないが)
レコード数が多いとそれだけ create index の処理時間も長くなる
>create indexを実行した直後から、インデックスの効果が現れると考えて間違いないですか?
Yes
773 :
771 :2010/12/03(金) 22:16:56 ID:???
>>772 ありがとうございます!
今実際に50万件程度のレコードがあるテーブルに実行してみましたが、10分ぐらいかかりました。
その間テーブルにロックがかかりサービスがほとんど停止状態に。。
すごく焦りましたが何とか上手くいきました。
>>772 >>create indexを実行した直後から、インデックスの効果が現れると考えて間違いないですか?
>Yes
そりゃ違うと思うんだがの。
「create indexが終了した直後から」ならyesだろうが。
レンタルサーバを乗り換えたときに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; のように引数を直書きすると正常に動きました。 ただ似たような部分はほかにも多くあり、できれば今の方式で対応したいです。 原因と対処方法をご教授いただけないでしょうか。 よろしくお願いいたします。
>>775 MySQLじゃなくてPHP(PDO)の問題では?
レンサバ変えてPHPも上がったのでは?
>>776 返信ありがとうございます。
元のサーバーのバージョンはもう確認できないのですが、おそらく
上がっていると思います。
ちなみに現状は、
PHP 5.2.11
MySQL 5.0.87
です。
PHPのバージョンが上がるとそこまで大きな仕様変更が起こったりするのでしょうか。
てっきりこの程度の下位互換はあるのかと思っていましたが。。
また後だしになってしまい申し訳ないのですが、他の場所の稼働確認をしてみたところ、
同じ構文で正常に動いている部分もあることがわかりました。
ということは、上記の書き方が間違っているのでしょうか。。?
>>777 PHPは、二つ目の数字が変更されるときは、
かなりの変更があります。
5.1→5.2とか、5.2→5.3で、動かなくなった
ものがけっこうありますよ。
>>778 そうなんですか。。
以前のところはPHP4or5と書いてあるのみで、phpInfo()なども実行したことがないので
5.0か5.1だったのかもしれませんね。。
情報ありがとうございます。
【MySQL】ドワンゴ技術勉?強会(2)【はじまった】
ttp://live.nicovideo.jp/watch/lv33653557 19:00 MySQL pluginについて(ドワンゴ/鬼海/星野/中村)
20:00 Spiderストレージエンジン(チームラボ/斯波様)
21:00 LT(ドワンゴ/鳥居)
21:10 MySQLを通じた全文検索エンジンSenna/Groongaの利用について(ブラジル/末永様)
ニコ生でこんなのやってるね
タイムシフト視聴できねーのかよ
タイムシフトは終わってからじゃね?
20G程のデータをを持っているdatabaseを削除したのですが、 dfコマンドで確認しても削除前と容量が変わっていません。 しかしdatabaseは削除されています。 drop databaseコマンドではデータ本体は削除されないのでしょうか? もう使わないdatabaseなのできれいさっぱり削除したいのですが、 どのように削除するのが正しい方法ですか?
784 :
NAME IS NULL :2010/12/07(火) 18:04:09 ID:iYpdO+Wq
10桁の金額を収めるカラムをつくろうと思いますが、 BIGINTで問題ないでしょうか? 整数しか収めないのでBIGINT型でも問題ないかなと思っていますが、 みなさんはどのように設計されてますか? DECIMALですか?
786 :
784 :2010/12/07(火) 18:41:27 ID:???
787 :
784 :2010/12/07(火) 18:43:52 ID:???
今INTの列に9999999999を入れたら 2147483647で入ってました。。。。
リンクされたとこを読めば、、、 bigintのunsighedなら、18446744073709551615まで入るって書いてある。 プログラムから、MySQLへアクセスしてるからでしょ。 変数の型も合わせないと。
789 :
784 :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でされているのでしょうか?
5.1.46 with rollupについて教えてください select id,sum(cnt) from rolluptest group by id with rollup; の結果、
+------+----------+ | id | sum(cnt) | +------+----------+ | 1 | 2000 | | 2 | 3000 | | 3 | 1000 | | 4 | 3000 | | 5 | 1000 | | NULL | 10000 | +------+----------+ 6 rows in set
この最後のnullの所に '小計'という文字を入れたいのですが select case when id is null then '小計' else id end as i ,sum(cnt) from rolluptest group by id with rollup; でもNULLのままです。 どうすれば宜しいんですかね
>>789 小数が必要ならDECIMAL、不要ならBIGINT
ただしBIGINTでも収まらないことが考えられるならDECIMAL
円なら通常BIGINTでいいんじゃね?
俺の環境だと上手くいくんだけど・・・ 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 | +------------------+
797 :
784 :2010/12/08(水) 13:29:46 ID:???
>>793 ありがとうございます。
ひとまずBIGINTで定義してみます。
Oracleのストアドインポートするツール 教えてください
ggrks
Oracleのパッケージを変換するツール 教えてください
ないよそんなの
今年初めにSun(MySQL ABを買収したとこ)をORACLEが買収したとは言え、 ORACLE系DBと連動や移植、それに差別化とかはどうなってるのかねぇ?
>>802 お前が情弱ってことは理解してあげたから、このスレのログぐらい読んでから
レスする程度の知能はつけろよ…
>>802 MYSQLをつぶす方向に進んでるよ
サポート料金も跳ね上がったとか
>>804 ちゃんと内容読んでこいよ。
安いほとんどサポート内容のないプランをやめただけ。
残ったプランは前と比べてよくなった部分も多い。
つぶそうとしてるかはわからん。まぁ潰れたとしても他に多くのforkがあるし、完全に死ぬことはないだろう。
mysql 5.1.41 OS XP トリガー、ストアドプロシージャなどをバックアップするのってどうするんですか?
808 :
807 :2010/12/11(土) 22:58:42 ID:???
mysqldump --no-create-db --no-create-info --no-data --routines <dbname> で出来るみたいです んん、、、、スレ汚しヾ(゚д゚;) スッ、スマソ
oracleのストアドをさくっと書き換えるコツ 教えてください
それもない ストアド移植するならPostgreSQLにしたほうがまだまし あっちはPL/pgSQLあるし
MySQLってストアドもないのか ダメ過ぎる
Web系のスキルの低さをなめんな。 セットで使われるのはPHPなんだぜ?
>>811 お前が無知なのと自分で調べる能力がないバカなのはわかった。
ストアドプロシージャ自体は存在する。PL/SQLのような言語がないってだけだ。
しっかし、この手のバカは粘着するんだよなぁ…
ストアドが無くても代換があり速度もそこそこならば 無くても問題なさそうな気はするが。
>>814 簡単な移行手段が無いのが問題かと思う。
同じことが同じソースで書けないのはつらい。
DBMS間でのSQLの移植性なんてあってないようなものだもんなあ 複数DBMS対応で売ってるものって実際問題どうしてるんだろう?
DBMS固有の機能を使わなければいいだけじゃないの?
FULL OUTER JOIN っていつからサポートされたんだっけ?
PHPのarray(64文字の文字列を30個)をMySQLで保存しておきたいのですが、どのような実装が一番スマートでしょうか? 今考えているのがSQL上にlog0〜log30という名のフィールドを確保して一行づつ保存する方法と、PHPのserializeを使って一つにまとめてから保存する方法を考えています。 前者はフィールドを配列の個数分確保するのがダメっぽいし、後者は一行の変更でも全部書き換えるのがダメっぽくて実装に踏みきれません。
30個しかないなら後者の方法で一行更新したってたかがしれてるとは思うが 配列のキーのフィールドと値のフィールドでテーブルを作ればいいんじゃないのか
すみません、説明不足でした。 db_userというテーブルにidその他のフィールドがあって、個人のデータとしてログのようなものを30行保存したいのです。 serializeで処理してしまっていいんですかね…
なんか目的がちょっと想像出来ないけど、 頻繁に更新するなら後者の方がいいような気もする。 また、一時的なものならmemcachedとかの方が楽そう。 serializedせずそのままarrayを入れられるし。
log テーブルを新規作成 1 user 毎に最大 31 レコード存在する
>>822 データは個人の行動のログを最大30件記録して、そのidに関わりのある他のユーザーが参照するものです
実は現在
>>823 の方法でデータを持っています。
db_logにidとlogを持つ方法です。
ユーザー数が少ないうちはいいのですが、ユーザー数が増加した場合の負荷が心配です。
自分のデータ更新、他人からの参照でサーチが大量に発生するため、どうせ読み込むことになる固定長の個人データとセットにしたほうが効率が良いのではないかと判断しました。
とはいえ、db_logにまとめて突っ込む場合でもユーザーidのインデックスは効くはずなので不必要な処理かもしれません…
「効くはず」と不明瞭なのは、例えば
1.ユーザー1のログが5行追加(同時に以前の5行を削除)
2.ユーザー2のログが2行追加(同様に削除処理)
3.ユーザー1のログが3行追加(同様に削除処理)
と、追加のタイミングと長さが不定のデータで本当に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:???
なお、明日も仕事が早いので寝ないといけないのでアドバイス頂いても返事は遅れてしまうと思いますがお許しください。
単に他のレコードと重複しないユニークな数値で良いなら insert 時に自動的に連番を振る AUTO_INCREMENT という機能があるが これでは駄目かな?
ビギナーなのになぜわざわざわかりにくい方法をとるのか
読むのマンドクセお前ら要約しろって事ですね、わかります
ち、違います。誤解です。 質問の仕方が悪かったですね。 単純に紐付けの仕方と、aテーブルの1つのレコードに bテーブルの複数の紐付く場合の、紐付け方と 読み出し方を教えて下さい。
眠くて全く頭が働いてないけどForeign Keyとかの話なのかな
834 :
832 :2010/12/14(火) 01:11:43 ID:???
X 単純に紐付けの仕方と、aテーブルの1つのレコードに ○ aテーブルの1つのレコードに にです。 お願いします。
リンク先の文字を読む気力がないので記憶だけで解説してみる 見当違いな解説してたらごめん。 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で検索したら山ほど出てくるから ググってみてくれ
なんでmysqlのストアドにグローバル宣言と inとoutないの? 糞過ぎる
811=836
838 :
NAME IS NULL :2010/12/14(火) 09:19:17 ID:tjmO7ufL
既存のDB設計を解析しております。 キャンペーンとしてテーブルがあり、「開始日(date)」と「終了日(date)」のカラムがあり、 「開始日」と「終了日」にプライマリキーが持たせてありました。 何かメリットはあるのでしょうか。 ER図を書く時にデータベースからリバースエンジニアリングしているのですが、正直この2個のカラムにプライマリキーはいらないんじゃないかと思います。
開始日が同じで終了日が異なるキャンペーンがあるんだろ。
840 :
NAME IS NULL :2010/12/14(火) 09:41:40 ID:tjmO7ufL
>>839 となると、ER図にする場合は必要ないということですよね。
プライマリキーは他のテーブルと結合するために必要なキーだと認識しておりますが、
開始日・終了日みたいに結合する項目がない場合は外してもいいのでしょうか。
キャンペーンテーブルの内容と使用状況が判然としませんので、勝手な思い込みで書きます。 [ 開始日+終了日 ] でプライマリーキーとすることで、index を作成する意図があるのかもしれません。 テーブルの使用状況として、開始日と終了日を組み合わせての検索が多いのであれば、そうした意図を含めてテーブルを作成する方も世の中に居たりします。 ER図にする上では、注目することではないとも考えられます。
842 :
NAME IS NULL :2010/12/14(火) 10:10:44 ID:tjmO7ufL
>>841 恐らく仰る通りだと思います。
ありがとうございます。
プライマリキーの場合開始日と終了日にはNULLは許されないという制約を忘れるとまずいよ。
インデックス張るべきかどうかの判断指針ってありますか?
カーディナリティが高いかどうかとか
検索が遅ければ貼る
848 :
ビギナー君 :2010/12/14(火) 23:09:24 ID:???
>>828 アドバイス有難うございます。
自分が付けてるIDは数字ではなく、独自形式なのと、
何度も何度もデータの追加、削除を限られた総量の中で繰り返す事を想定しているため、
削除したものの再利用が出来ない手段は取れません。
やはりIDの最後尾をどこかに保存しつつ、削除した時は削除済みID貯めこみ用のテーブルを作り、
そのテーブルで再利用出来るものが無かった時に再び最後尾から採番していくのが良さそうかなと思いました。
削除する時も他のデータの参照IDとして使われてないかチェックしないと中身のすり変わりが起こりますしね。
・プログラム起動時に、IDの最大値を取得する ・テーブルに削除フラグフィールドを追加する(indexも) ・情報の削除時、レコード削除ではなく削除フラグを立てる ・情報の追加時、削除フラグが立っているレコードを検索して存在すればそれを update 削除フラグが立っているレコードが存在しなければ、最大値の次の値を振って insert、最大値更新
850 :
NAME IS NULL :2010/12/16(木) 20:57:54 ID:3NO7AVhu
インデックスマージって、どの程度効果があるものでしょうか。 個人的には、過度な期待は禁物な機能だと思っているのですが。 (複数カラムで1つのインデックスを張ったほうがずっといい) 感覚的ですみません。
漢のコンピュータ道の開設間待ち
>>850 感覚的にはそれでいいと思う
Oracleでも速くなった経験がない>インデックスマージ
varcharとtextの違いってなんですか? 両方とも最大格納文字数って65535ですよね?
856 :
NAME IS NULL :2010/12/17(金) 23:26:49 ID:Uu3BKaZa
>>853 Oracleにインデックスマージの機能ってあったっけ?
857 :
NAME IS NULL :2010/12/19(日) 17:57:55 ID:/aTRiTPD
LOAD DATA LOCAL INFILEでロードする場合、 入力ファイルは一旦クライアントからサーバに転送されてから DBにロードされるのでしょうか。 だとすると、サーバには入力ファイルが転送できる分のディスク空き容量が必要なのでしょうか。
>>857 > LOAD DATA LOCAL INFILEでロードする場合
クライアント側からの実行ですか?
サーバー上での実行ですか?
859 :
NAME IS NULL :2010/12/19(日) 22:15:27 ID:TTyRkooc
DBのテーブル設計についてアドバイスをください。(長文失礼します) SNSもどきのサイトを作っているのですが、 自分のマイページにお気に入りユーザーの行動を逐一通知する機能を作ろうと考えています。 例えば、お気に入りユーザーが「日記を書いた」「写真をアップした」「他の日記にコメントをつけた」等の 行動をとった場合に、自分のマイページに行動履歴が表示されるようにしたいのです。 その際、行動履歴のデータはどのように取得すべきなのでしょうか? 単純に、マイページを表示する度に必要な情報を各テーブルから取得れば実装は可能です。 具体的には、 全てのお気に入りユーザーについて entryテーブル、pictureテーブル、commentテーブル、等、ユーザーのアクションに関連するテーブルから データを引っ張ってきて新着順に表示する感じです。 ただ、お気に入りユーザーが増えたら物凄く重い処理になりそうです。。 もう一つの案としては、 行動履歴用のテーブルを別に用意して、 ユーザーが何かしらのアクションを起こした時に、本来のテーブルとは別に 行動履歴用のテーブルにもデータを保存するようにすれば マイページを表示する際には一つのテーブルから検索するだけでよくなるので良さそうです。 どちらの方法が一般的なのでしょうか? また違う方法あるのでしょうか? facebookなどにもある機能なので理想的な実装方法がありそうなのですが ネットで調べてもなかなか見つかりませんでした。
860 :
NAME IS NULL :2010/12/19(日) 22:16:45 ID:/aTRiTPD
DB分散を始めてみようと思っています。 どのDBサーバにどれくらい負荷がかかっているかを モニタリングするような仕組みはありますか? WindowsのタスクマネージャーのCPU利用率みたいなグラフだとなお良いです。
>>859 自分なら後者。
おそらく大量のinsertがあるだろうから当然innodbで。
863 :
NAME IS NULL :2010/12/20(月) 11:16:02 ID:8JXmBtVW
>>860 マニュアルを読み返してください。
サーバー側からの実行とクライアント側からの実行についての注意点が書かれています。
>>864 Looking for previous GA versions?をクリック
>>865 ありがとうです。5.1.54が見つかりました
INSERTがある日突然遅くなった(数msだったのが数十秒に)んだけど どんな可能性があるでしょうか。 状況としては ・INSERT ... ON DUPLICATE KEY UPDATEを使っている ・SELECTを使ったINSERTではない ・特定のテーブルへのINSERTだけが遅い ・そのテーブルをロックするクエリなんて無い ・トランザクションの途中なのに重い (commitで時間がかかるほうがまだ理解できる) 自分の知識で思いつく範囲では、ロックされてるとしか思えないので やっぱりどっかでロックしてるのかなぁと思うのですが。
インデックスがいっぱい貼ってあるとか mysqlcheckしてみるとか
インデックスは単項目のが3つあるけど INSERTとはいえ事実上はUPDATEで、どのインデックス項目も更新しない というときでも遅い…。 データもたかが4万行程度。 mysqlcheckは知らなかったのでちょっと調べてみます。
870 :
NAME IS NULL :2010/12/22(水) 14:43:57 ID:J74ILn00
レプリケーションを組んで、Master1台とSlave1台で運用しています。 この構成だと、Masterでハードウェア障害が発生しても、 Slaveに引き継ぐことで、可用性を確保できると思いますが、 例えば、Masterに間違って(又は悪意で)データをDROPした場合に、 DROP直前までのデータに戻すことが困難です。 フルバックアップファイルと、Masterのバイナリーログから復旧させると時間が掛かりますが、 出来れば、週一でフルバックアップ、それ以降は差分ログとして取得する方法を考えています。 Masterを停止させてフルバックアップさせるのが一番簡易ですが、 Masterを出来れば停止させずに、Slaveだけで実行できる方法はございますか? SlaveでSTOP SLAVEをしてからフルバックアップしても、バックアップ後の差分ログが取得する方法が分からないので、 困っています。良い方法があればご教示下さい。 宜しくお願いします。
>>867 他のテーブルがどうなってるかわからんが、インデックスの総量がメモリに収まらなくなってディスクアクセスが発生しちゃってるとか
メモリは十分に積んでるけど設定で使い切れてないとか
5.5になって、パフォーマンスが大幅に改善したらしいけど、 実際に使っていて、変わったっていう人いますか? 実際にどうなのかを聞いてみたい。
互換性がメタメタ
876 :
NAME IS NULL :2010/12/23(木) 18:23:01 ID:YZc0Oqr1
バックアップの考え方について教えてください。 バックアップ方法として、mysqldumpを忌み嫌う人が多いのは何故でしょうか? データが膨大になると致命的になるのですか? うちの会社のサービスはDBの総データ量がまだ10GB程度なので フルでバックアップとっても数分で終わります。 その間は確かに接続が困難になるのですが、週1で深夜3時とかなので問題ないと思っています。 ここら辺の考え方は間違っているのでしょうか? 会社にWebサービスのノウハウが無いため一般常識が欠落していそうで少し怖いのです。
>>876 大きな誤解があると思うけど、mysqldumpだと論理バックアップが取れるだけ。
だから、リカバリーしようとした時に、リカバリが正常に出来ない場合が多々発生する。
mysqldumpは緊急用であって、業務で使うのは論外。
何かの原因でDBが異常をきたした場合って
他のバックアップ方法でも影響を受けるように思うけど
>>877 が業務で使ってる方法は何なの?
>その間は確かに接続が困難になるのですが、週1で深夜3時とかなので問題ないと思っています。
mysqldumpしている間は、接続が困難になるって、 そもそも何? 接続が困難じゃなくて、単に落ちているってことでしょ。 サーバー落とすような運用がそもそもどうかと思うけど。
みなさんは保存ドライブに、もうSSDは使ってますか? SSDだと実質オンメモリDBに近い代物になると考えて良いのかな。 今は、安価なMLCタイプでも総書き込み数700テラ持つとかで、 寿命的には100年かけても使い切るの無理レベルだし そろそろ検討しても良いのかな、と思いまして。
SSDを使うことを検討するような高負荷のサイトなら、 いっそうClusterを使った方がスケールアウトがしやすいし、 速度も圧倒的に速いでしょ?
883 :
881 :2010/12/23(木) 20:53:47 ID:???
>>882 なるほど。 つまりSSDではレスポンスの改善は期待できないということでしょうか?
期待できないことないけど、実効の転送速度がSASと余り変わらない。 それに、SASに比べてSSDの信頼性は格段に低いから、そもそもサーバー向きじゃない。 それなら、まずRAID0+1で4台くらい並列でやってみることが先で、 それでも限界ならClusterかもね。
SSDの評価で転送速度て。本当に分かってんのかね
>>884 お前がとんでもないシッタカってことは理解してあげた。口から出まかせ
撒き散らされると迷惑だから、もう二度と湧いてこないこと。
>>876 リストアが遅い
一度リストアのテストしといたほうがいいよ
888 :
NAME 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は著者、カテゴリ、タグのいずれか
その著者名とか分類とかタグに別のフィールド (たとえば分類コード)があって、そのフィールドも検索対象になるなら そういうテーブル構造がいいんだろうけど、 名称だけしか必要ない(twitterのハッシュタグみたいな)んだったら 記事: id, body 著者: id, 記事_id, name カテゴリ: id, 記事_id, name タグ: id, 記事_id, name でいいんじゃねえかなぁと思う昨今
5.1 <-> 5.5 の比較ってここでもないのねん
893 :
NAME IS NULL :2010/12/29(水) 23:15:50 ID:1wfFybCd
5.5のインストール方法教えてほしい。 今までみたいに./configure使わなくなってない?? codeからMacにinstallしたいんだけど、どうしたらいい??
>>893 ソースを展開したこともないけど、INSTALLとかREADMEってファイルもないん?
>>893 うん。configureじゃなくなったようだ。
自分はどうやったっけな。インストールスクリプトがあったような。それはバイナリの場合か。
897 :
NAME 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の取得が上手く行きません どうすれば上手く行きますでしょうか?
>>897 それって、comment は一意に決まる?
899 :
NAME IS NULL :2011/01/02(日) 17:14:13 ID:GQVFH3+l
>>898 uniqueではないです。。。
ユーザー投稿なので自由にコメント出来ます。
>>899 それだと、例えば↓のとき、comment が決まらなくない?
guid id pt update comment
xxxxxx 1 3 2011-01-01 00:01 最高!
xxxxxx 1 1 2011-01-01 00:01 やっぱりダメ
voteテーブルに通し番号付ければいいだけでねーの?
902 :
NAME IS NULL :2011/01/02(日) 20:01:47 ID:GQVFH3+l
通し番号があれば最新の、というか最後の投稿だけ拾う事は可能だな
>>902 タイムスタンプ関係なく、追加するオートインクリメント行の最大値が最新じゃん
905 :
NAME IS NULL :2011/01/03(月) 11:26:57 ID:AhcXKhDT
少しは自分で考えろよ。
連番なくても平気じゃね? voteのidとupdateをキーに最新ポイント付与日時が抜ける。 FROM句に、テーブルsongと、voteをinner joinしてgroup by id,nameしたものを置き、 SELECT句で、id,name,ptのsumaryをそのまま表示。 commentは、SELECT句で相関サブクエリにて引っこ抜けばよい。
助けて下さい! XAMPPのMySQLadminを使って小数点のカラムを追加したいんですがうまくいきません>_< 作りたいのは整数部7桁、小数部2桁の(7,2)カラムです データ型をflowt、doubleどちらにしても構文エラーでした SQLのクエリー式ご存知の方いたら教えて下さいm(__)m ググっても自分だけの現象みたいなんです
お前はどう書いたんだよ ちなみにテーブル操作はクエリ式じゃなくてDDLな
>>909 どう書いたも何もテーブルの項目追加ページで
データ型「double」、長さ「7,2」で追加しようとしただけです
>>910 マニュアルありがとうございます!
これでクエリー式調べてみます!
5.5.8入れてみた なんか色々と廃止になったオプションがあって削るのに苦労したわ…
913 :
NAME IS NULL :2011/01/04(火) 07:06:40 ID:1v2YMLI4
> テーブルの項目追加ページで わ〜くべんち にふんぞりかえってすわってるのかな?w
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行取れてしまいます。 スタート位置は正しいのですが、終わり側が不安定です。 これは、何が悪いのでしょうか? 似た事例等は、あるのでしょうか?
>>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' を実行すると何件と表示されますか?
>>914 その結果は正しく安定してます。 第2引数は、取得したい「行数」です
917 :
915 :2011/01/04(火) 11:10:44 ID:???
私が悪ぅ御座いましたorz レスくれた方有難う御座いました。 2つめに、終わりの行番号を指定していましたが、 ここは、取得したい行数の指定でした。
918 :
NAME 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 なのです。よろしくお願いします。
919 :
NAME IS NULL :2011/01/04(火) 19:04:43 ID:1v2YMLI4
>>918 > でも抽出したいデータは
抽出したいデータの考え方がわかりません。
> 東京 140
> 東京 190
なぜ、東京/140 ではなく、東京/190 を取り出したいのですか?
カラムBにて、値の大きな方を取り出したいのですか?
920 :
NAME IS NULL :2011/01/04(火) 19:32:22 ID:FE7Ji5jL
>>919 そうです。値の大きな方を取り出したいです。
言葉足らずですみません。
select A,MAX(B) from table group by A GROUP BY句で指定したカラム以外は、集約関数で括らないといけない。
922 :
NAME 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
ありがとうございました。
合ってるのかどうか分かりませんが…。
923 :
NAME IS NULL :2011/01/06(木) 03:36:01 ID:7315SOVM
MySQL 5.087(Tritonn最新版)を使ってます。 割と長いあいだ運用した後、SSL接続する必要が出てきて調べたのだけど、 Open SSL接続するには ./configure するときに --with-openssl として 組み込んでおかないとダメと知りました。 今から入れ直すのは出来れば避けたいのですが、 後から入れるのは無理ですかね?
>>923 デフォルトでw/sslオプションが入ってない限り無理だと思う。
データダンプしておいてコンパイルしなおすしかないでしょう。
>>923 この際MySQL5.5のプラグインによる日本語全文検索も検証してみては?!
927 :
923 :2011/01/06(木) 23:35:51 ID:7315SOVM
>>924 >>925 んー。やっぱ総入れなおししかないかー。
innodbで楽に全文検索できるのってないですよね?
>>927 そもそもsslの目的は?普通データベースはバックエンドだから、外部から直接アクセスも通信の中見ることもできないと思うけど。
もしWAN越しに直接データベース触るために、とかならvpnとかはどうだろう。
Tritonnは5.0で打ち止めだし、今後のことを考えれば5.5の検証をかねて総入れ替えもいいのでは。grooongaが安定してくれるといいんだけど。
>>928 VPSで複数契約して分散させたい、というのが理由です。
専用サーバなら考えることもないんだろうけど。
gronngaはまだ出たばかりですかね。
where句で月別にデータを取得する方法を教えて下さい。 GROUP BY DATE_FORMAT(date, '%Y%m')みたいな方法は見つけたのですが、 where句で取りたいのです。
>>930 where句でどうやりたいの?
日本語で書いてみて。
select * from hogehoge where year(日付カラム)= 2010 and month(日付カラム)= 12; みたいな?
それはその月のデータだけを抽出してるのであって 「月別にデータを取得」ではない
>>932 ダサい方法としては、そのまんま
WHERE DATE_FORMAT(date, '%Y%m')='201012'
かな。
WHERE EXTRACT(YEAR_MONTH FROM 日付カラム ) = 201012の方が良さそうだけど いずれにしろ月別にデータを取得したければGROUP BYするしか無いんじゃね
普通に不等号で比較するようにした方がいいね 検索対象を変換してちゃ速度はまったく稼げんよね
変換関数使うとコーディングは便利だけどインデックス効きません
ハイスコア表示したいのですが scoreというintの中から 点数が高い方から10件取得とかってどうやればいいのでしょうか
>>939 まずはSQLの基本でも勉強してから・・・
941 :
939 :2011/01/08(土) 22:28:59 ID:???
え?SQLのスレじゃないんですか?
select score from table_name order by score desc limit 10; こんな小学生でもわかりそうな回答書かせるなよ恥ずかしい
943 :
NAME IS NULL :2011/01/09(日) 02:43:34 ID:K+3Mz0uI
すいません、質問してもいいでしょうか? UNIXにMySQLいれたら 「information_schema」と、「mysql」と「test」ってDBが 元からあるのですが、これはどれも削除してはならないのでしょうか? よろしくお願いします。m(___)m
945 :
923 :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 になってしまう。 パスが間違ってるはずはないのですが、 何か考えられるミスはあるでしょうか?
946 :
NAME 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 と正規化 どれが一番現実的でしょうか?
>>946 3回読み直したが、質問の意図が読み取れなかった。スマソ
1番はなんか生理的にイヤ 2番はカラムが少ないならいいけど47カラムは多すぎる 3番が良さげ
普通、3番なのでは?
タプル数が10万単位だと、一番速いのは2番だよね?
普通は3ですよ。 2でboolean使うなら、64ビットカラム1個作ってフラグ管理するとかもあるけど。
普通は3番でも、
>>946 がやる3番は、何か違うものになりそうな気がする・・・
954 :
945 :2011/01/11(火) 09:22:17 ID:hGqp7xTm
あー…解決しました。一応書いておきます。 パスじゃなくてファイルの権限ミスでした。そんなことだと思った…orz ちゃんとmysqlのユーザーにしましょうってことで…。 chown mysql:mysql file.key でOkでした。
955 :
NAME IS NULL :2011/01/11(火) 20:57:10 ID:9K/XG28C
レプリケーションについてご教示ください。 マスターで、テーブルAに対するLOAD DATAによる登録が完了した直後、 テーブルBに対して更新があったとします。 このとき、スレーブにテーブルBの更新が反映されるのは、 スレーブでのテーブルAの登録完了後になるのでしょうか。 スレーブで、テーブルA登録と並行してテーブルBが更新されることはない?
>>955 詳しくはないがbinlog順なら並列はないんじゃないかな
958 :
NAME 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
959 :
NAME 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を出すことが出来ず悩んでいます。
こういう時に left join 使えばいいんですね…。
961 :
955 :2011/01/13(木) 22:49:16 ID:NVXKU1p8
>>956 >>957 ありがとうございます・
1テーブルに大量件数LOAD DATAすると、
全テーブルのレプリケーションが遅延してしまうんですね。。。
962 :
NAME IS NULL :2011/01/14(金) 11:04:06 ID:uJ5LUOx7
バッチで30個のテーブルに1万件ずつほどのデータを登録しようと思っています。 バッチで登録処理を行なっている間も他のプログラムからテーブルへの 参照が行われる事が考えられるのでトランザクションを貼ろうと考えていますが、 beginをバッチの開始直後,commitをバッチの終了時に行うと 凄くパフォーマンスが悪いように思えます。 テーブル単位でトランザクションを貼ると、 他のプログラムから参照を行ったときに テーブル間のデータの不整合が発生することが考えられるのですが、 みなさんはこういう場合はどの様に設計されますか?
>>962 > バッチで登録処理を行なっている間も他のプログラムからテーブルへの
> 参照が行われる事が考えられるのでトランザクションを貼ろうと考えていますが、
参照が行われるからトランザクションを使う?
その発想にいたる背景がわからないので答え難い。
安易にバッチ処理での登録と考える前に、
登録処理中にテーブル参照されることで発生する不都合が何かを考慮してから、
データ登録の方法を考えるべきだと思います。
964 :
962 :2011/01/14(金) 14:11:23 ID:???
>>963 言葉足らずで申し訳ありません。
テーブルを参照するプログラムは
データの集計を行うプログラムになります。
Aというテーブルではバッチからの更新が終了しているけれど
Bというテーブルではまだバッチで更新中となっている場合
HOGEというプログラムが両方のテーブルの情報を集計するとなると
テーブル間の不整合が発生するのでトランザクションを使用しています。
そして今回はバッチで登録・更新をするテーブルの数が多いので
>>962 にあるような質問をさせていただきました。
HOGE というプログラムが、テーブルAとテーブルBを参照するんですね? そのHOGEというプログラムが、テーブルAとテーブルBに登録処理をしている最中でも稼動するんですね? HOGE というプログラムがシステムの中で重要度が高いのであれば… テーブルAとテーブルBにデータを登録する際には、HOGEというプログラムを考慮して、 テーブルAとBへのデータ登録は両テーブルの整合性が取れている状態として1件ごとに処理をする。 そんな方法を検討する可能性も有ります。 述べられている「参照するプログラム」が出力する結果が、そのシステムでどれだけ重要であるかを考慮する必要があります。 逆の意味で述べれば、テーブル更新が終了する前に、システムとして重要な出力結果を出すHOGEを実行しない、これが適切だとも言えます。
初歩的な質問ですが探してもわからなかったので質問します MySQL5.1をInnoDB Pluginで使っていますが、 1つのテーブルのカラム数は大体このくらいまでにしておいた方が良い、ってのはありますか? 扱うデータが多くて、素直に組むとカラム数が200ぐらいになるのですが これが1億レコードぐらいになると、パフォーマンスに結構影響しますか? 経験がなくてわからないので、皆さんの意見を聞きたいです
>>966 InnoDBは8KBのレコード長制限がある。
VARCHAR、TEXTなど長いカラムはページ外に保存されるのだけど、
200カラムは作れない可能性が高いので事前に確認しないとだめ
作れるなら性能はそんなに気にしなくてもよい
>>964 別にバッチ処理中か確認するようにすれば?
別テーブルにフラグみたいなもん立てるとか。
素直にトランザクションで解決してなにが悪いのかワカラン。 コミットに時間がかかってもバッチ処理なら問題ないだろうし。
ユーザー作成時に CREATE USER <ユーザ名> IDENTIFIED BY '<パスワード>'; この時に同時に権限を設定するという事は出来ないのですか?これはあくまでもユーザーを作成するだけで 権限付与は従来からのgrant文でということ?
役立たずの古い技術者です。 バッチプログラムからデータベースのデータ処理をするときに、 カーソルを使って、1件ずつ読みだして処理する。。 という、昔ながらの手法があります。 MySQLで同じような処理を行おうと思いましたが、 カーソルに対応していないことを知りました。 カーソルのフェッチに相当する処理をCライブラリで 実現しようと考えていますが、結果セットを取得するAPIでは 処理実現が厳しいかな?と考えています。 Mysql_store_result()は結果セットをローカルに保存するので、 結果が大量になったとき、メモリ不足が発生しそうで、 枕を高くして眠れません。 Mysql_use_result()は1件読み出しが実現できますが、 対象のテーブルがロックされるとマニュアルに記載があります。 検索範囲や分離レベルによらずに、です。 これでは、バッチ処理が終わるまで他の処理が継続できなくなります。 あとは、mysql_stmt系のサーバ再度カーソルがあるようですが、 サーバ側のメモリを大量消費&閾値こえるとMyISAMにデータコピーする 仕様になっており、ちょっと手を出すのをためらわれます。 MySQLで大量データを保管するテーブルで、バッチで範囲指定(これも大量にヒットする) してデータ抽出し処理したい場合、どういう処理をしているのでしょうか?
範囲指定をsqlのselectで指定して 後はupdateするだけじゃね? 行指定ならlimit使うだけ 何がわからんの?
>>971 サーバサイドのmysql_stmt_fetch()使うしかない気がする。
大きな結果セットでMyISAM使うとしても
それってOracleでORDER BY、GROUP BYなどによって一時テーブル使うのと
そんなに変わらない、といいね
>>972 LIMIT 0, 100
LIMIT 100, 100
…
というのは案としてあると思う。
けどACIDとるために最初にテーブルロックせざるをえない
>>971 > カーソルを使って、1件ずつ読みだして処理する。。
> MySQLで同じような処理を行おうと思いましたが、
> カーソルに対応していないことを知りました。
あなたの言われている「カーソルに対応していない」とは、何を指しているのか理解できません。
>>974 カーソル知らないの?
1行ずつフェッチして、更新したりできるんだよ、大量データを逐次処理できるの
> カーソルに対応していない カーソルは知っているけれども、対応していないが漠然としているのでは?
977 :
NAME IS NULL :2011/01/16(日) 11:06:21 ID:P3g9vKaN
>>971 >カーソルに対応していないことを知りました。
あなたの使ってるMySQLはカーソルに対応していない
だろ。正確に書いてよ
>>971 カーソルに対応しているmysqlがあるとでも?
>>979 それ、ストアドだって。
もともと、Cライブラリでカーソルとかいうことじゃね?
問題は、MySQLの通信プロトコル上、非prepare系のAPIでは SQLを実行した瞬間に結果の全件がクライアントに送られるところ。 MySQLのカーソル操作はクライアント上でエミュレーションしているに過ぎない。 だからSELECT結果が5GBとかに達する場合、クライアントが32bitだと処理できない。 他のRDBMSでは「次のレコードをよこせ」というリクエストを送って 数十レコードごと逐次結果が返されるようになっている。 mysql_stmt_prepare()系は逐次レコードを返すはずだけど そもそもMySQLでそういうバッチ処理を書く人があまりいないので ノウハウが少ない。
ウェブ系以外でMySQLよりPostgreSQLが使われるケースが多い理由のひとつ。
983 :
962 :2011/01/17(月) 10:58:33 ID:???
>>965 レスありがとうございます。
>HOGE というプログラムが、テーブルAとテーブルBを参照するんですね?
そうです。
>そのHOGEというプログラムが、テーブルAとテーブルBに登録処理をしている最中でも稼動するんですね?
そうです。
>テーブル更新が終了する前に、システムとして重要な出力結果を出すHOGEを実行しない、これが適切だとも言えます。
こちらの方法を検討してみようかと思っています。
ただ、バッチは30分近くかかりそうなので、
その間HOGEが実行されないのが業務用件的にNGになりそうな気配もあります。
>>968 ありがとうございます。
その方向で少し検討してみます。
>>969 大量のデータを登録・更新するときって
トランザクションをずーっと貼りつづけていると
すこぶるパフォーマンスが落ちることってありませんか?
あ、バックグラウンドのバッチだからそんなの気にしなくてもいいじゃないかって
ことでしょうか?
>>983 >
>>969 > 大量のデータを登録・更新するときって
> トランザクションをずーっと貼りつづけていると
> すこぶるパフォーマンスが落ちることってありませんか?
InnoDBのMVCCはそこまでアホな実装じゃない。
バッチだから仮に遅くても気にしなくていいってのはそう思うし。
985 :
NAME IS NULL :2011/01/17(月) 22:53:41 ID:NkbyBHZG
レプリケーションで、スレーブで起動されるSQLスレッドの数は 1スレッドのみなんでしょうか?
1スレッドのみです