2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

MySQL 総合 Part18

1 :NAME IS NULL:2010/06/11(金) 18:17:19 ID:CZ3w74oP
オラクル社製(予定)RDBMS、MySQL の総合スレです。
MySQL 総合 Part15(16) http://pc11.2ch.net/test/read.cgi/db/1240291265/
[関連スレと過去ログ]
http://find.2ch.net/index.php?STR=MySQL
http://makimo.to/cgi-bin/search/search.cgi?D=db&q=MySQL&sf=0&link2ch=on
MySQL 総合 Part17
http://pc11.2ch.net/test/read.cgi/db/1258928470/

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

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

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

・関連ツール及びユーティリティ
・関連書籍
>>2

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

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

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

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

【関連書籍】

[MySQL Books]
http://dev.mysql.com/books/
http://www.amazon.co.jp/exec/obidos/search-handle-url/ix=books-jp&fqp=keywords%01MySQL
http://www.amazon.co.jp/exec/obidos/search-handle-url/ix=books-us&fqp=keywords%01MySQL

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型を変換して結合する事は出来ないのでしょうか?

4 :NAME IS NULL:2010/06/12(土) 03:19:34 ID:???
まずSELECT文で2010-06の形に表示できないでしょ君

5 :NAME IS NULL:2010/06/12(土) 06:52:58 ID:???
こっこれは>>1乙じゃないなんたらかんたら

6 :NAME IS NULL:2010/06/13(日) 00:38:09 ID:n4WAyuno
ついにHPにオラクルのロゴが・・・
健全なDBの発展にとって、障害にならないことを祈るよ。

7 :NAME IS NULL:2010/06/13(日) 01:45:05 ID:???
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で複合キーを設定するにはどうすればよいのでしょうか?

10 :NAME IS NULL:2010/06/14(月) 16:20:21 ID:???
複数のテーブルをJOINして抽出しています。
データ量が増えるほど抽出に時間がかかるようになりました。

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



11 :NAME IS NULL:2010/06/14(月) 16:36:25 ID:???
主キーには自動的にインデックスが作成される

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という一つのテーブルに
まとめても良いんじゃないか?とも思っています。

どちらの方が管理しやすいか、先が見えないので悩んでいます。

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

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

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

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

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

先々扱う種目が増えるたびにテーブル自体増やすって
あんまりやりたくないし。


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 男

みたいに一つのテーブルにまとめる考え方で良いのでしょうか?

16 :NAME IS NULL:2010/06/14(月) 20:05:17 ID:???
id|name|sex
1 aaa M
2 bbb F
3 aba M

id|team-id
1 1
1 2
2 3
3 3


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 を無効にすることは可能なのでしょうか?

クレクレで申し訳ないのですがお教えいただければ幸いです。


20 :NAME IS NULL:2010/06/17(木) 07:55:24 ID:???
そのなかではiSCSIがいちばんあやしい

21 :NAME IS NULL:2010/06/17(木) 13:21:53 ID:???
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がアップグレードされていない?

それとも他に原因があるのでしょうか?
ご教授願います。


23 :NAME IS NULL:2010/06/18(金) 18:45:58 ID:???
これ見てよ↓
http://livedoor.blogimg.jp/tekepo/imgs/3/4/3414dfca.jpg
ばらまこうぜ!


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

25 :NAME IS NULL:2010/06/19(土) 05:47:26 ID:???
'%藤%'の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が上記の結果に含まれる"

よろしくお願いします。

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

ただやりたいことを想像するに
SELECT INTO OUTFILEとLOAD DATA LOCAL INFILEの方が
便利ではないかと思われます。

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郎までは
苗字が違うだけです。

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




30 :NAME IS NULL:2010/06/19(土) 13:22:57 ID:???
とりま、テーブルの文字コード指定も絡むから話が面倒だけど、
like '__藤%' だとどーなのよ

31 :NAME IS NULL:2010/06/19(土) 13:41:50 ID:???
なるほど。そしたら
__藤%
___藤%
の処理結果と、
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バイト消費する。
だからアンダーバーを二つつける必要がある?という感じでしょうか…

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

本っ当に助かりました。
ありがとうございます。

33 :NAME IS NULL:2010/06/19(土) 13:51:58 ID:???
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";

よろしくお願いします。

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

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

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

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

なぜ遅いかはこちら
http://nippondanji.blogspot.com/2009/03/mysql_25.html


37 :NAME IS NULL:2010/06/19(土) 16:40:48 ID:???
まちがえた
SELECT ed.* FROM entry_data ed
INNER JOIN entry e ON ed.entry_id = e.entry_id
WHERE e.entry_date BETWEEN xx AND yy

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 →解決せず
って状態なんだけどどーしたらいい?

41 :NAME IS NULL:2010/06/20(日) 23:33:01 ID:???
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回避するとか
そういうケースのみと考えて良いのかな?

ご意見よろしくお願いします。

43 :NAME IS NULL:2010/06/21(月) 13:59:05 ID:???
libmysqlclientが使ってるプロトコルをjavaで実装できないか検討してます。
理由はjavaで直にmysqlと通信したいからです。
調べた限りではなかったのですがすでにこういったjavaのクラスは公開されてるでしょうか?
実装するとしたらprotocolbufferとか使えるのでしょうか.
識者の方,ご教授ください.


44 :NAME IS NULL:2010/06/21(月) 14:00:20 ID:???
commitするかどうかはエラーをラップして決めるんじゃない?
php風に書くと
try {
  $dbh->beginTransaction();
  (アップデートとかの処理)
  $dbh->commit();
} catch (Exception $e) {
  $dbh->rollBack();
}

みたいな感じで、ちゃんとエラートラップしないと意味ないような気がする

45 :NAME IS NULL:2010/06/21(月) 14:06:41 ID:???
>>43
よくわからんけど、JDBCじゃダメな理由は?

46 :NAME IS NULL:2010/06/21(月) 14:29:20 ID:???
理由はかけませんが直でmysqlと通信したいのです。


47 :NAME IS NULL:2010/06/21(月) 14:32:20 ID:???
>>46
ならCで書いたら?

48 :NAME IS NULL:2010/06/21(月) 14:40:17 ID:???
Cならlibmysqlclient使います。
javaのクライアントでmysqlと直で話をしたい、JDBCは使いたくないわけです。


49 :NAME IS NULL:2010/06/21(月) 14:45:58 ID:???
>>48
ソケット通信でも自分で実装すればいいんじゃね?

50 :NAME IS NULL:2010/06/21(月) 14:48:30 ID:???
最悪、自分で全実装すればいいですが、
どこかにすでに公開されたクラスがないか、
または楽に実装できる方法があるか、たとえばprotocol bufferを使うなど、
知りたかったわけですが


51 :NAME IS NULL:2010/06/21(月) 14:51:06 ID:8qylY79Y
>>44
レスありがとうございます
try〜catchの形は理解出来るんだけど、その(アップデートとかの処理)の中に
たとえばinsertクエリの結果の検証(ちゃんと一行増えたかな?)とかも含めるの?
事前にチェックした行数とクエリ後のlastInsertId()の値を比較するとか。。

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

エラー(カラムのデータ型と送信値のデータ型の不一致とか)でクエリ失敗するとロールバックされるのは
わかるし、同様に上みたいな検証しなくても「ちゃんと一行増えない=エラー発生」の時も
ロールバックされると思ってたので、チェックの必要なんて無いのではと思ってたんだけど
どうなんだろう?

52 :NAME IS NULL:2010/06/21(月) 14:56:49 ID:???
>>51
insertコマンドがエラー返さなければ、暗黙の了解で成功したと見れるんじゃないの?
てかそれがbegin>commitの意味だと思うけど。

53 :NAME IS NULL:2010/06/21(月) 15:17:00 ID:8qylY79Y
>>52
そうですよね!? それなら良いんです、安心しました
他の人の意見ももらえたら嬉しいですが、、 ありがとう

54 :NAME IS NULL:2010/06/21(月) 20:30:50 ID:???
そんなの言い出したら今度は
確認用のlastInsertId()をさらにチェックするとか
始まるだろ。
やりたきゃ好きなだけやれよ。

55 :NAME IS NULL:2010/06/22(火) 21:27:41 ID:???
>>51
馬鹿発見

56 :NAME IS NULL:2010/06/22(火) 22:11:33 ID:???
複数のWebサービスから利用されているMySQLサーバを運用しているのですが、
このサーバがここ最近突然重くなりました。
大したアクセス数のあるサイトを持ってるわけでもなく朝方のような時間帯でも重いので
何か特殊な原因があるのではないかと考えて調査しているのですが検討が付きません。

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

ここら辺が異常なのは分かるのですが原因が分かりません。
何か考えられる原因はあるでしょうか?

57 :NAME IS NULL:2010/06/22(火) 22:22:02 ID:???
お前さん岡崎市立中央図書館のシステム作った会社の人か?

58 :NAME IS NULL:2010/06/23(水) 00:59:59 ID:???
まずはスロークエリログを設定してデータ収集して調べるところから。

59 :NAME IS NULL:2010/06/25(金) 00:20:39 ID:???
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秒かかるのはやっぱり遅いですよね?)

よろしくお願いします。

61 :NAME IS NULL:2010/06/26(土) 20:13:39 ID:???
>>60
>>58

62 :NAME IS NULL:2010/06/26(土) 20:15:55 ID:???
サブクエリは使わない条件なのかい?
ちなみに歌手が違うジャンルの曲を歌ったときの対応とかどうよという気がしないでもないが。

63 :NAME IS NULL:2010/06/26(土) 20:36:38 ID:TQu1MBDb
>>61
調べてみます

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

歌手とジャンルの対応を言われると厳しいです。
曲といっしょにその曲のジャンルまで収集できる仕組みを作れればいいのですが、
そこがうまくいかなかったのでとりあえず歌手は特定のジャンルのみとしました。
歌手が別のジャンルの専門になったら、
歌手ごとにジャンルを変えてしまおうという感じです。

64 :NAME IS NULL:2010/06/26(土) 21:31:58 ID:???
>>60
曲番号を1カラムにまとめないで、歌手番号と歌手毎分類番号の2カラムで
複合主キーにしたら?

65 :NAME IS NULL:2010/06/26(土) 22:15:02 ID:???
>>63
>サブクエリは使っていません。 (キリッ

いや、そういうのを聞きたいわけじゃなくて、「特定のジャンル、歌手番号、歌手名、曲番号、曲名」を
1クエリで引っ張ったらいいんじゃないの?という話なんだが。

66 :NAME IS NULL:2010/06/26(土) 23:17:08 ID:???
ジャンルとか曲番号に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
ジャンル、曲番号にはインデックスが張ってあります。

以上、よろしくお願いします。

68 :NAME IS NULL:2010/06/27(日) 02:06:19 ID:???
ttp://alfalfalfa.com/archives/398564.html
ttp://www.unkar.org/read/tsushima.2ch.net/news/1277472565

MySQL嫌われ杉ワラタ
つか有償ライセンスってそんなに必要になるケースってないだろ?

69 :NAME IS NULL:2010/06/27(日) 07:24:28 ID:???
頭が変になりそうだ、

70 :NAME IS NULL:2010/06/27(日) 08:54:56 ID:???
>>67
ボトルネックは明らかにPHPでのループとインデックスの使われてないであろう曲番号LIKE検索だろう。
DB構造もロジックも両方直さないとな。

71 :NAME IS NULL:2010/06/29(火) 19:40:42 ID:???
テーブルの中で日々増大するテーブルがあり、
それは滅多に使わないものですが、とっておきたいデータです。

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

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

全ては、定時バッチで処理したいと考えています。アドバイス宜しくお願いします。

72 :NAME IS NULL:2010/06/29(火) 19:41:32 ID:???
ちなみに、 MySQL5.1、InnoDBを使っています。宜しくお願いします。

73 :NAME IS NULL:2010/06/29(火) 20:36:02 ID:???
障害が発生したらmysqldumpが異常終了すると思うけど、
気になるなら別のサーバにリストアして件数でも数えてみたらいいんじゃないの


74 :NAME IS NULL:2010/07/07(水) 15:49:13 ID:o6uZh2cy
既出だとは思うのですが、ネットで調べても具体的な数値が見えてきませんでしたので質問させてください
InnoDBとMyISAMは後者の方が早いらしいですが、大体どの位スピードは違うのでしょうか?
大規模なDBなど扱ったことがないので分からないのですが、今までもDB以外の分野でこっちの方が高速と書かれていても、実際はさほど差はないということも多々ありました
体感的、具体的にはどの位早いのでしょうか?
もしそれほどパフォーマンスに差がないようならばInnoDBに一本化しようかと考えているのですが


75 :NAME IS NULL:2010/07/07(水) 16:07:24 ID:???
>>74
>>InnoDBとMyISAMは後者の方が早いらしいですが

使い方によるんじゃない?

76 :NAME IS NULL:2010/07/07(水) 16:36:48 ID:???
こういう記事? >>74

ttp://www.inter-office.co.jp/contents/164/

77 :NAME IS NULL:2010/07/07(水) 17:12:37 ID:???
パフォーマンスに多少の差があってもInnoDBに一本化していいと思う

78 :NAME IS NULL:2010/07/07(水) 18:16:43 ID:???
トランザクションがない時点でステ>MyISAM

79 :NAME IS NULL:2010/07/07(水) 19:13:20 ID:dGxQf47y
トランザクションがないなら
NoSQLで良いな

80 :NAME IS NULL:2010/07/07(水) 19:55:49 ID:???
今、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桁で定義するので、データが違ってきますか?
定義とデータの大きさの関係が分からないので、どなたか教えて下さい。

82 :NAME IS NULL:2010/07/07(水) 20:32:12 ID:???
マニュアル見ればいいんじゃね? >>81

ttp://dev.mysql.com/doc/refman/4.1/ja/storage-requirements.html
これは、4.1 のものだけど。


83 :NAME IS NULL:2010/07/08(木) 07:05:24 ID:???
>>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です。

ただし万全を期してフルバックアップはお忘れ無く。

85 :NAME IS NULL:2010/07/09(金) 02:19:37 ID:???
MySQL勉強中の、未熟者です。
本を読んでも実務に直結する内容の情報がなかったので質問させてください。

仕事(業務)で、webアプリケーション用のDBを構築しなくてはいけない状況で、
クライアントさん(お客さん)のサーバーで作業、動作確認ができないという場合、
仮に他のサーバー上でテストしておくというのはよくあることなんでしょうか。
他のサーバーでテストして作っておいたデータベースを
お客のサーバーでまったく同じように再現する?感じですか。
その場合、サーバーへのアクセスはSSHで行うというので正しいでしょうか。
レベル低い質問ですみません。

86 :NAME IS NULL:2010/07/09(金) 02:38:00 ID:???
仕事なら上司に聞けばいいんじゃねーの?

87 :NAME IS NULL:2010/07/09(金) 02:50:05 ID:???
>クライアントさん(お客さん)のサーバーで作業、動作確認ができないという場合、
>仮に他のサーバー上でテストしておくというのはよくあることなんでしょうか。
よくある、というか、普通はそうなる。
>サーバーへのアクセスはSSHで行うというので正しいでしょうか。
前段との関連が意味不明だけど、
物理的(インフラ)なテストと、論理的(アプリ、データ)なテストとでは目的が違うから、何が必要かは一口には言えん。

88 :NAME IS NULL:2010/07/09(金) 09:04:30 ID:???
>>83
内部データを格納するmysqlデータベースがMyISAMで作られているので
skip-myisamはできない

89 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 08:45:56 ID:???
MySQL5.0.51aでデータベースを構築しています

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

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

http://gihyo.jp/dev/serial/01/sql_academy/0005?page=1
ここを参考にしながらやったのですが、どうも上手くいきません
どのようなクエリを書けばいいのでしょうか?
よろしくお願いします

90 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 10:31:54 ID:???
試しちゃいないが、こういう感じのこと?

SELECT ktoday.ID, ktoday.sale, ktoday.hinichi
FROM kanri ktoday, kanri kbefore
WHERE
   to_days(ktoday.hinichi) = to_days(now())
 AND to_days(ktoday.hinichi) - to_days(kbefore.hinichi) = 5
 AND ktoday.sale <= kbefore.sale

91 :名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:03:30 ID:???
>>90
ありがとうございます
日付のとり方でODBCのエラー(VARBYTE)が出ましたが
そこだけ変えたら上手くいきそうな感じになりました


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のコマンドラインで実行するのは、シェルスクリプトで使いたいからです。
よろしくお願いします。


93 :NAME IS NULL:2010/07/12(月) 13:02:46 ID:???
>>92
mysql -u root dbname -e 'desc table1'

94 :NAME IS NULL:2010/07/12(月) 13:21:10 ID:???
isattyで出力を切り替えてるから
これじゃリダイレクトかパイプすると駄目だ
スマソ忘れてくれ

95 :NAME IS NULL:2010/07/12(月) 13:31:29 ID:???
-tオプションで良さげ

96 :NAME IS NULL:2010/07/12(月) 14:30:01 ID:???
>>95
-t オプションできました!ありがとう、愛してる!

97 :NAME IS NULL:2010/07/12(月) 17:18:54 ID:mKjPxL2y
mysqlって構造が全く同じなら1つのテーブルにまとめたほうが高速なの?
数千万件のレコードから検索する場合。

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

何か判断の指針ある?

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

というわけで、んなこと考えとらんで、適切なカラム構成とインデックス、
それとSQLの最適化に頭使った方が良いよ。

99 :NAME IS NULL:2010/07/14(水) 22:11:34 ID:???
read/writeの割合が半々とwriteの比率が高くクラッシュしても空テーブルから再始動することが許容されるinnodb mysql においてI/Oがボトルネックで悩んでいる場合、データディレクトリをtmpfsにすることはありでしょうか?

100 :NAME IS NULL:2010/07/14(水) 22:17:25 ID:???
メモリにおきゃいいじゃん>テーブル

101 :NAME IS NULL:2010/07/15(木) 07:26:08 ID:???
クラッシュ時のデータ損失が許されるなら
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時に問題がでると思って
大量の小さなテーブルって方を選択しました。

103 :NAME IS NULL:2010/07/16(金) 18:04:21 ID:???
初心者質問ですみません。

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

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

考えられる原因は何で、どうすればDSNを追加できるようになるのでしょうか?

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との違いが知りたいと思います
具体的にどのような所がフリーと有料とで違うのでしょうか?

106 :NAME IS NULL:2010/07/17(土) 23:19:29 ID:???
サポート

107 :NAME IS NULL:2010/07/18(日) 11:44:12 ID:???
ソース共通だからダウンロードしてくれば商用版ビルドできるよ
ログイン時のメッセージが変わります

108 :105:2010/07/18(日) 13:24:25 ID:???
>>106
サポートだけなのですか?
確かにMySQLの本とかでも商用版とフリー版でこういう機能が違うというような一覧など見かけたことはありませんが

>>107
そうなのですか
それにログイン時のメッセージくらいなものなのですか・・・


109 :NAME IS NULL:2010/07/18(日) 13:32:14 ID:???
ライセンス条項読めばいいんじゃね?

110 :NAME IS NULL:2010/07/18(日) 16:21:53 ID:???
>>108
ここは違うの?
ttp://www-jp.mysql.com/products/which-edition.html

111 :NAME IS NULL:2010/07/18(日) 16:54:24 ID:???
ttp://www.softagency.co.jp/products/mysql/mysql_enterprise/

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

高いね・・・
Basicなんて殆ど意味が無いような気もするけど


112 :NAME IS NULL:2010/07/18(日) 17:45:36 ID:???
仕事でSIやってるならたいして高くないでしょ

PostgreSQLの方が高い
http://www.sraoss.co.jp/prod_serv/support/pgsql-mainte.php

113 :NAME IS NULL:2010/07/18(日) 19:08:03 ID:???
そうかなぁ、1台だけだとまぁって感じだけど数台ともなるとコストも馬鹿にならないし

114 :NAME IS NULL:2010/07/19(月) 08:50:14 ID:???
もう一人コード書きを雇おうか、ってときの選択肢なんだからこんなもんだろ。
BASICは、サポート代ってより子守代か。

115 :NAME IS NULL:2010/07/23(金) 08:42:20 ID:REpy7JWz
MySQLにレコードを登録更新するときにはどのようにされてますか?

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

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

なお、開発言語はPHPを使用しています。


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

5.0.41はできました
my.cnfからmy.iniになってるし、どなたかわかるかたいませんか?

117 :NAME IS NULL:2010/07/26(月) 12:25:46 ID:???
文字列 '1:00' は 60秒、'1:00:00' は3600秒と解釈させるにはどうしたらいいでしょうか。
select time_to_sec('1:00');
とすると、3600となってしまいますが、これを 60 と解釈してくれるオプションがあればいいのですが。

118 :NAME IS NULL:2010/07/26(月) 17:44:38 ID:???
>>117
あまりいい方法は見つからなかった
mysql> set @t = '1:00';
Query OK, 0 rows affected (0.00 sec)

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

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

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


119 :NAME IS NULL:2010/07/26(月) 17:50:39 ID:???
ごめん1:0:0のときにバグるね
あとはまかせた

120 :NAME IS NULL:2010/07/26(月) 19:38:40 ID:???
CentOSのMySQLを5.0系から5.1.49にアップデートしました。
そして、service restart mysqldとしたところ、起動せず、ログに以下の記録が残っていました。
100726 18:54:05 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
100726 18:54:50 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
100726 18:54:50 [Note] Plugin 'InnoDB' is disabled.
/usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist
100726 18:54:50 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
100726 18:54:50 [ERROR] /usr/libexec/mysqld: unknown option '--skip-bdb'
100726 18:54:50 [ERROR] Aborting
100726 18:54:50 [Note] /usr/libexec/mysqld: Shutdown complete
100726 18:54:50 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
書いてある通りに、mysql_upgradeをやってみたのですが、
mysqlcheck: Got error: 2002: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) when trying to connect
とでて、起動しませんでした。
どうすれば起動するようになりますか?

121 :NAME IS NULL:2010/07/26(月) 20:42:09 ID:???
>>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を繰り返すため、定期的な最適化が必要で、その為には一つ一つのテーブルが小さい方がメンテナンスを細かく行なうことができるので、メリットがあります。
それと、今後サイズが更に増えた場合、処理速度が落ちないか心配です。

アドバイスを頂けたら幸いです。どうぞ宜しくお願いします。

123 :NAME IS NULL:2010/07/29(木) 22:44:26 ID:???
履歴データとかで、もう参照しないデータなら別テーブルに分ければいいと思うが、
参照するデータを別テーブルに分けて、どうやって運用していくつもり?
メリット以上にデメリットが多いんじゃないの?

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 *******)

みたいな形で複数を一度にインサートするスマートな方法はありますでしょうか

126 :NAME IS NULL:2010/07/30(金) 00:37:16 ID:???
つ (select 1,2,c from *** where *******)

127 :NAME IS NULL:2010/07/30(金) 00:50:38 ID:???
ありがとうございます!

128 :NAME IS NULL:2010/07/30(金) 01:02:23 ID:???
できました。スマートになりました。
あとは速度的な問題ですが、検証してみたいと思います。

129 :NAME IS NULL:2010/07/30(金) 02:03:10 ID:???
速度はほとんど変わりませんでした

130 :NAME IS NULL:2010/07/30(金) 03:39:00 ID:???
もうひとつお願いします。

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

これは
テーブル table1 のカラムa と テーブル table2 のカラムhogehogeが合致するものを検索
でよかったでしょうか。
よろしくお願いします。

131 :NAME IS NULL:2010/07/30(金) 03:40:03 ID:???
>>122
典型的なパーティショニング機能の適用ケースだと思うけど
http://dev.mysql.com/doc/refman/5.1/ja/partitioning.html

132 :NAME IS NULL:2010/07/30(金) 03:40:42 ID:???
× SELECT a,b,c FROM table1 where EXISTS (SELECT * from table2 where a=hogehoge)
◯ SELECT a,b,c FROM table1 where EXISTS (SELECT * from table2 where hogehoge=a)

に訂正します。

133 :NAME IS NULL:2010/07/30(金) 04:09:05 ID:???
>>130
その書き方はおそらく性能が悪い。普通はこう
SELECT t1.a, t1.b, t1.c
FROM table1 t1
INNER JOIN table 2 ON t1.a = t2.hogehoge;

134 :NAME IS NULL:2010/07/30(金) 04:10:02 ID:???
>>132
評価式の左右がどっちとかRDBMSには関係ないよ

135 :NAME IS NULL:2010/07/30(金) 04:10:55 ID:???
>>133
誤記
>INNER JOIN table 2 ON t1.a = t2.hogehoge;
INNER JOIN table t2 ON t1.a = t2.hogehoge;

136 :NAME IS NULL:2010/07/30(金) 10:01:16 ID:???
>>134
オプティマイザに関係してくるでしょ

137 :NAME IS NULL:2010/07/30(金) 11:33:47 ID:???
>>136
いやー少なくとも今のバージョンは関係ないと思う

オプティマイザは最初に推移律が成立するものを
ゴリゴリ書き換えて、左右もそのときに直すはず
だけど証拠がないので時間があったらソース確認してみる

138 :NAME IS NULL:2010/07/30(金) 13:41:23 ID:eCwiMoLf
>>131
頂いた内容を拝見しましたが、とても便利な機能ですね。
長く使っていましたが、初耳でした。もしかしてMySQLの開発者の方でしょうか?
大変助かりました。早速来週から使ってみようと思います。

これからも、ご活躍を願っております。

139 :NAME IS NULL:2010/07/31(土) 21:54:54 ID:???
初歩的ですみません。
ユーザ情報のテーブルを作成し、フィールドにパスワードの項目を追加したのですが、
SHOW FIELDS FROM [テーブル名];
としたときに、パスワードの列を****のように表示させることはできるのでしょうか?
ぐぐってもMySQLの管理者パスワード関係のものばかりで、うまくヒットしないもので・・・。

140 :NAME IS NULL:2010/07/31(土) 22:41:22 ID:???
パスワード見たくないなら、カラムにはハッシュ化後の値を書き込むよろし。

141 :NAME IS NULL:2010/08/01(日) 05:55:34 ID:???
基本的にはINNER JOINって遅いんですかね?
普通に抽出したものをperlなりphpなりで仕分けしたほうが断然早かったです。
SQLの書き方が悪いのかなぁ

142 :NAME IS NULL:2010/08/01(日) 06:15:32 ID:???
INNER JOIN *** ON (a = b)

これだと a=b の条件にマッチしたものをjoinしますが
逆にa = bが成立した場合はjoinしないという方法はありませんでしょうか
!=だとインデックスが使われないので悩んでます

143 :NAME IS NULL:2010/08/01(日) 06:44:55 ID:???
いろいろ調べましたらjoinが遅いのではなくて
その後のorder byが遅いのがわかりました。
joinしたものにはインデックスが適用されてないということですね。

joinする前に予めソートしておけばと思うのですが
そのような事は可能でしょうか。
やり方を教えていただけると嬉しいです。

144 :NAME IS NULL:2010/08/01(日) 09:42:35 ID:???
効果はあるみたいだよ。 >>143
ttp://nippondanji.blogspot.com/2009/03/using-filesort.html

ことによっちゃあ数百倍早いんだってさ。
ttp://www.flatz.jp/archives/2199

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

情報が少ないからエスパー混じるけど、ORDER BYで複数テーブルの
フィールドしているのが原因かと。
>>144読めば分かるけどテーブルを跨いでソートする場合、結合した大き
な結果セットをソートするから遅くなる。
一時テーブル(a, b)を作って、これにインデックスを張っておく。ORDER BY
はこの一時テーブルのを指定して、この一時テーブルに対して結合するように
すれば軽くなるかもしれない。

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倍違いました。

149 :NAME IS NULL:2010/08/01(日) 14:50:33 ID:???
コピペミスってるのか知らんけど
遅い方の 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

151 :NAME IS NULL:2010/08/01(日) 15:57:41 ID:???
下のパターンで速くなるなら、
上のクエリにSTRAIGHT_JOINつけてみて。

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

うまくいったら両方のEXPLAIN見せてほしい

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:???
とおもったら、しばらく回してたら激重になっちゃいました。
もう少し本とか買って勉強したいと思います。
お付き合いありがとうございました。

154 :NAME IS NULL:2010/08/01(日) 21:51:07 ID:???
0.1秒を切るレベルでのチューニングなのか
そしたらちょっと難しいな

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

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

あとはパラメータ側で、MyISAMならkey_buffer_size、
InnoDBならinnodb_buffer_pool_sizeを数十〜数百MBに増やす、
それからsort_buffer_sizeを1〜2Mに増やしてみるぐらいかな

155 :NAME IS NULL:2010/08/02(月) 11:12:07 ID:???
MySQL 5.0.91
CentOS 5.4

DBアクセスを参照のみに制限したくて、
GRANT SELECT on `test-db`.* to `db-user01`@`%` identified by 'password';
FLUSH PRIVILEGES;
とやったのですが、試したら普通にUPDATEできてしまいます。
書き込みを制限するにはどうすればいいんでしょうか?

156 :NAME IS NULL:2010/08/02(月) 13:38:34 ID:???
基本的な事聞いていいですか

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

a,b,c全てにインデックスを貼っている場合と、一つ或いは二つしか貼っていない場合だと速度は違いますか
つまりwhereで使うもの全てにインデックスを貼ったほうが性能があがるんでしょうか

157 :NAME IS NULL:2010/08/02(月) 13:59:13 ID:???
はい

158 :NAME IS NULL:2010/08/02(月) 14:25:29 ID:???
ありがとうございました。

159 :NAME IS NULL:2010/08/02(月) 18:11:12 ID:???
>>155
よくあるのがdb-user01以外で繋がってしまっているケース
mysql> status;
してCurrent user: を確認してみて

160 :NAME IS NULL:2010/08/03(火) 12:08:01 ID:???
>>159
どうもです。PHPからdb-user01で接続しているのでそれはないですね。
人に聞いたら、そもそもそういう書き込み制限はできないみたいです。
じゃあGRANT SELECTって何よ、って気もしますが…。ぐぐったらできそうなこと書いてあったんですが
実際できないものはしょうがない。
アプリ側で誤って書き込まないよう気を付けるしかないようですね。不安だ。

161 :NAME IS NULL:2010/08/03(火) 12:55:51 ID:???
ほんとに、updateとかの権限が無いかどうか確かめてみては?

use mysql;
select * from user where user='db-user01'\G

162 :NAME IS NULL:2010/08/03(火) 14:04:05 ID:???
>>161
どうもです。
いろいろ試してる間にSELECT権限も消しちゃったのか、priv関連は全部Nになってました。
それでも参照も書き込みもできます。

163 :NAME IS NULL:2010/08/03(火) 15:16:29 ID:???
そしたらあとはmy.cnfに
skip-grant-tables
が入っているとか?

164 :NAME IS NULL:2010/08/03(火) 23:30:14 ID:DnqSeYXe
MySQL Clushter(GPL版)についてお尋ねします。
web上での情報を集めていて、これから導入するか検討中です。

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

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

私の運営しているサイトが次第に人が増えて乗り換えが必要になってきたのですが、
冗長性と同様にパフォーマンスも改善したいと思っています。

165 :NAME IS NULL:2010/08/03(火) 23:46:22 ID:???
導入しない方が良いと思うな。ありゃ有料サポート必須。

166 :NAME IS NULL:2010/08/04(水) 02:52:37 ID:urkSox1R
ありがとうございます。
もし、宜しければ理由をお聞かせ頂けると助かります。

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

などですか?

167 :NAME IS NULL:2010/08/04(水) 16:50:14 ID:???
それが調べられれないレベルだからだと思うが。。

58 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)