MySQL 総合 Part13

このエントリーをはてなブックマークに追加
947NAME IS NULL:2008/06/04(水) 16:53:49 ID:sTUXwMfM
UPDATE test SET name='aaa' WHERE id='1'
UPDATE test SET name='bbb' WHERE id='2'
UPDATE test SET name='ccc' WHERE id='3'

と言うように、各レコードを更新するに辺り
上記のように3回のSQLを実行せずに、まとめて1回で実行する
方法はありますでしょうか?
948NAME IS NULL:2008/06/04(水) 17:20:59 ID:???
UPDATE test SET
 name=IF(id=1,'aaa),
   IF(id=2,'bbb',
    IF(id=3,'ccc', 'xxx')
   )
 )
WHERE id in (1,2,3)
949NAME IS NULL:2008/06/04(水) 17:44:01 ID:???
それで速くなるの?
950NAME IS NULL:2008/06/04(水) 17:46:30 ID:???
試せばわかるんじゃね?
951NAME IS NULL:2008/06/04(水) 19:41:26 ID:???
ぐぁぁああぁ…replace into って、delete → insert だから、
autoincrement のフィールドの値が変わるじゃねぇか…。
952NAME IS NULL:2008/06/04(水) 23:33:29 ID:R8ngxTCT
mysqlで誰にも知られていない
秘密のコマンドがあると聞いた
そのコマンドとは?
953NAME IS NULL:2008/06/04(水) 23:46:50 ID:???
とりあえずマニュアル読めば誰にも知られていないわけではないけれど
>>952が知らないコマンドは出てくるんじゃないの?
954NAME IS NULL:2008/06/05(木) 01:51:04 ID:???
>>952
またかよ…。 だからSELECTだっつってんだろが
955NAME IS NULL:2008/06/05(木) 11:41:51 ID:???
秘密のコマンドはあります。
でも誰も知らないから誰も答えられません。
956NAME IS NULL:2008/06/05(木) 16:34:39 ID:539Qwkef
WebARENA SuitePRO V1を使っていて
mysql-3.23.58-16.FC3.1から
アップデートしたいのですが、
どうすればよいのでしょうか?
957NAME IS NULL:2008/06/05(木) 18:55:13 ID:???
素直にV2 に移行する。
958NAME IS NULL:2008/06/05(木) 20:17:33 ID:539Qwkef
>>957
やはりそれが一番簡単ですかね。
ドメインとメールアカウントが
けっこうあるので移転がめんどうだ・・・
959NAME IS NULL:2008/06/07(土) 02:13:41 ID:YKItF8pv
ここで質問してもいいのかな?
もし、スレ違いだったら誘導してくれると嬉しいです。

服の検索をするためのテーブル設計について行き詰まっています。
同じ服だけど、他種類のサイズがある場合、
どういうテーブル設計にすればいいか考えあぐねています。

現状では、
 (1) 服のサイズ以外の基本情報テーブル
 (2) 服の型番で、各サイズごとに記載したテーブル
を用意しています。

サイズで検索し、当てはまった商品の基本情報と全サイズ一覧を出す場合、
一度のリクエストで、何度もクエリを送信しなければならず、非効率です。

何とか良い方法はないでしょうか?

あるいは、そういう目的別のテーブル設計事例集などがあればいいのですが、
テーブル設計でAmazon検索しても、なぜか魔法瓶が羅列されてしまって、参考になりませんw
お薦めの本、あるいは、複数サイズの洋服の最適なテーブル設計があれば、
ヒントだけでも頂けませんでしょうか?
960NAME IS NULL:2008/06/07(土) 03:54:16 ID:???
JOINしたら一発ででね?
961NAME IS NULL:2008/06/07(土) 07:45:35 ID:???
JOINでもVUEでも一発で出すことはできるんですが、
型番ごとに各サイズを格納するという作業をプログラム側でやってしまうのは、
良い方法なのでしょうか? なんか泥臭い感じがして。
962NAME IS NULL:2008/06/07(土) 09:19:41 ID:???
>型番ごとに各サイズを格納するという作業をプログラム側でやってしまうのは、

あのね、「服の型番」と「サイズ」がどういう関係にあるか自体、業界外の人間には分からないんだ。
「型番」が決まればサイズが決まるのか、それとも、型番→サイズというハイアラーキーになっているのかとか…。

「型番」=「商品の基本情報」(のプライマリキー)で、「型番」→「サイズ」がハイアラーキーなのなら、
「型番ごとに各サイズを格納するという作業」は単なるJOINだから、プログラム側では何もしなくてよいのでは。
963NAME IS NULL:2008/06/07(土) 09:48:42 ID:???
なんだかシステム・エンジニアの要件定義そのもだな。

業界や会社の物事を、いかにコンピューター上で実現するか。
964NAME IS NULL:2008/06/07(土) 10:50:32 ID:???
>>962
例えば、型番「hoge」の中にS(15)、M(20)、L(25)があるというイメージです。
言われているハイアラーキーな関係になるかと思います。

>>959で言うと、
(1) テーブルに、型番「foo」の基本情報のフィールドがあり、
(2) テーブルに、S、M、L というサイズのフィールドが、
型番「foo」に対してそれぞれあります。

上記前提で、
例えばサイズ検索をして、hogeのMが引っ掛かった場合、
「foo」の全サイズ情報も出力したいので、SとLのフィールドが必要になります。

しかし、型番「bar」のサイズ展開は、L、XL、XXLであるため、
型番を元に、サイズをひとつのフィールドにまとめてしまうと、
検索するのに問題が生じます。

よって、それぞれのサイズのフィールドに、
各型番の基本情報をまとめるようなビューを作成しなければならないのです。
この方式だと、検索結果に一致したサイズの型番で
改めてクエリを投げて、結果をまとめるという処理が必要になります。

未熟なので、もっと効率的な方法はいくらでもあるのでしょうし、
指摘されている方法であっけなく片付けられる手順があるのかも知れませんが、
それを学ぶ手段や書籍を見つけられずに試行錯誤しているのが現状です。

MySQLに関してチューニングや入門書はいくらでも見つけられるのですが、
こういう事例に関しての設計例は、一切見つけられなくて困っています。

何とかお知恵あるいは書籍の情報を頂ければと思うのですが。
965NAME IS NULL:2008/06/07(土) 11:14:02 ID:???
>それぞれのサイズのフィールドに、各型番の基本情報をまとめる

の意味が分からん。

単純に、これじゃだめなの?
基本情報に「bar」があり、サイズがMかLのものを取得。

create table dress (RID int primary key auto_increment, ID varchar(24), sz varchar(8));
create table info (RID int primary key auto_increment, ID varchar(24), body text);

insert into dress (ID,sz) values ('foo','S'),('foo','M'),('foo','L),('bar','S'),('bar','M'),('bar','L'),('bar','LL'),('bar','LX');
insert into info (ID,body) values('foo','dress type foo'),('bar','dress type bar');
select distinct D.ID,D.sz,I.body from dress as D left join info as I using (ID) where (I.body like '%bar%' and( D.sz = 'M' or D.sz = 'L'));
966964:2008/06/07(土) 11:14:09 ID:???
・サイズ情報テーブル size
n,type,size,length,width
1,'foo','S',15,40
2,'foo','M',20,45
3,'foo','L',25,50
4,'bar','L',24,52
5,'bar','XL',28,58
6,'bar','XXL',32,64

・商品情報テーブル item
n,type,name,info
1,'foo','ふー','フーな感じです。'
2,'bar','ばー','バーな感じです。'

かなりシンプルにしましたが、
テーブルのイメージとしてはこんな感じです。

ここからsize.lengthで検索し、
一致したtypeの商品情報と他のサイズの情報を取り出したいのです。

良い設計あるいは最適な取り出し方について事例を知っていれば
教えて頂けると嬉しいです。
967964:2008/06/07(土) 11:26:12 ID:???
>>965
すいません、入れ違いました。
ご回答ありがとうございます。
ただ、>>966のようなイメージなのです。

>>965だと、barのLに関するdress, info情報は返ってきますが、
同時に(同時じゃなくてもいいですが)、barのLLとXLのdress情報も欲しいのです。
968NAME IS NULL:2008/06/07(土) 11:30:15 ID:???
サブクエリ exists の定番。

試してないけど
select distinct I.type,I.name,S.size,S.length,S.width from item as I left join size as S using(type)
where exists (select X.type from size as X where (X.size = 'M' and X.length= 15 and X.type = I.type);
969NAME IS NULL:2008/06/07(土) 11:31:40 ID:FRaL8y0I
winmysqladminnとやらは
5.0や6.0のバージョンではないの?
コマンドからしかできないのですかね?
970NAME IS NULL:2008/06/07(土) 11:56:22 ID:???
>>968
ありがとうございます。
非常に参考になります。
かなり欲しい結果に近い部分を得られました。

select distinct I.type,I.name,S.size,S.length,S.width from item as I left join size as S using(type)
where exists (select X.type from size as X where (X.length=15 and X.type=I.type));
で、fooのsize「S」が一致し、fooの全ての情報が取り出せました。

これに、X.length=15にあてはまるS.sizeがどれなのかも合わせて欲しいのです。
やはり、その場合は2回クエリを投げる必要がありますか?

実際のテーブルは規模がもっと大きいので、
検索結果が100件あるとすると、
ひとつのリクエストなのに1+100回クエリを投げないといけなくなり、
どうにか上手にまとめられればと思います。
971964:2008/06/07(土) 12:03:39 ID:???
すいません。>>970は私です。

よく考えると、>>968さんのクエリと、
通常のサイズ検索クエリ(select size from size where length=15;など)の2回やれば、
欲しい結果が全て得られることが分かりました。
1回では不可能な気がするので、現状最善の方法が見つかりました。

これでどうにかなりそうです。
大変勉強になりました。ありがとうございます。
972NAME IS NULL:2008/06/07(土) 20:56:12 ID:???
>>969
GUI tools
973NAME IS NULL:2008/06/08(日) 09:11:08 ID:???
configureについて質問です。ターゲットのプラットホームは Windows XP Pro SP3 で、
mysql-5.1.24-rc-win32.zip をダウンロード&解凍し、インストール自体は問題無くできたのですが、
その後に行う Server Instance Config Wizard の最後のでエラーとなってしまいます。

ttp://sylphys.ddo.jp/upld2nd/pc3/src/1212883375565.png
ttp://sylphys.ddo.jp/upld2nd/pc3/src/1212883466326.png

(恐らく、推測、妄想…)パスワードを設定したのにも関わらず、
パスワードなしでログインしようとしてエラーになっているのでしょうか?だとしたら、バグ?

結局、この最後に行う "Apply Security Settings" って何を行うのでしょうか?
974NAME IS NULL:2008/06/08(日) 13:16:18 ID:???
mysql5で最初から作られている
information_schema
っていうデータベースって削除してよい?
本家の解説読んでもイマイチワカランカッタ
975NAME IS NULL:2008/06/08(日) 13:42:57 ID:???
manual 29.7.5 には、「触るな」と書いてあるが。
976NAME IS NULL:2008/06/09(月) 02:47:03 ID:???
>>974
それVIEWみたいなもんだろ。
各テーブルの情報がテーブルっぽく見えてるだけのような。
消す意味が分からん。
977NAME IS NULL:2008/06/09(月) 02:54:10 ID:???
>>974
おまいは testデータベースも残しておけ
978NAME IS NULL:2008/06/09(月) 22:10:35 ID:???
>>974
information_schemaはRDBMSにとって必須なものだよ。
Windowsのレジストリってよくわからない設定しか書いてないから
消してよい?って言ってるようなもん。
つまり、「それを消すなんてとんでもない。」
979NAME IS NULL:2008/06/10(火) 01:29:46 ID:???
CREATE VIEW v AS SELECT * FROM t;
みたいにしてビューを作ると「*」が展開された形で作成されてしまい、
元のテーブルtのカラムが増減したときビューを作り直さなければならない
のですが、「*」を展開しない状態でビューを作ることはできないのでしょうか?
980NAME IS NULL:2008/06/10(火) 03:18:18 ID:dXdBkxZR
phpMyAdminのクエリ統計で、
? /秒の数値を見ているのですが、
「52.55」になっています。
起動してから一秒当たり52.55回SQLが発行されたという意味だと思いますが、
MYSQLでどの程度まで耐えられるのでしょうか?
これから、アクセスが伸びていくサイトなので、どの辺までが限界が読めなくて困っています。

max_connectionの設定を1000にしてあるので、最大接続数エラーになったことはないのですが、
サーバーのこの数値がここまでいくと、そろそろ限界っていったものがありますか?

宜しくお願いします。
981NAME IS NULL:2008/06/10(火) 08:33:45 ID:???
>>980
そうゆうのは、本番環境に投入する前にベンチなりとっとくもんじゃね?
それに、当然CPU,Memにもよるだろうし、ほかのプロセス(httddとかphpとか)状況にもよるし、
なにより、どんなクエリが発行されるかによって、(同一ハード環境でも)はっきり言って100倍違う。

ちなみにウチの環境だと、
cpu Core Duo 2.0Ghz Men 1GB で、
ごく軽いクエリをmysqldが100%cpu使って20000/s以上出るけど、
ちょっと複雑なクエリにすると、途端に1000/s位になるし、
Apache + mod_perl で実環境に近い状態でやると250/s位。
だからウチの場合ではその近辺まではなんも手ぇ打たんでいいかなと判断してる。(現状 20-25/s位で推移してるし)

もちろんこれはウチの環境に限っての話であって、これらの数値は全く意味をなさないけど。
サーバマシンの構成やデータ量、どんなクエリ投げてるかは、君しか知らんから、一概にいくらとは言えないよ。
982NAME IS NULL:2008/06/10(火) 12:02:34 ID:gwmqg6/k
JMeter でも使ってなんかベンチするとか.
983NAME IS NULL:2008/06/10(火) 12:42:51 ID:???
linuxにてシェルスクリプトでデータベースやテーブルの雛形構成を
作りたいと思っているのですが、手動なら>mysql 起動後に
SQLを打ち込んでいますが、スクリプトからの場合はどのような
方法が良いでしょうか?
984983:2008/06/10(火) 13:45:11 ID:???
すみません、自己解決しました。
テキストファイルにコマンド列記し、
mysql -u root < hoge.txt でいけました。失礼しました。
985NAME IS NULL:2008/06/10(火) 14:13:38 ID:???
mysqldumpで 指定したフォルダに保存したい場合は
どうすればいいんでしょうか?
教えて下さい。
986985:2008/06/10(火) 14:49:42 ID:???
自己解決致しました。
申し訳ありませんでした。
987973:2008/06/10(火) 16:40:12 ID:???
ひょっとして、この現象に見舞われてるのは俺だけなのか?
988NAME IS NULL:2008/06/10(火) 17:11:57 ID:???
いきなりバグ呼ばわりは無視される。
989NAME IS NULL:2008/06/10(火) 23:19:32 ID:???
って言うか、これはバグだろ。俺の方でも起こるし。5.0 使えばいい
990NAME IS NULL:2008/06/11(水) 08:29:18 ID:???
windowsのコマンドプロンプトで

> mysql

> mysqladmin

はどう違うんでしょうか?
991NAME IS NULL:2008/06/11(水) 09:22:08 ID:???
administrator(管理者権限)で入るか入らないかの違い。
992990:2008/06/11(水) 11:27:50 ID:???
>>991
レスありがとうございます。
では、administratorとrootはどう違うんでしょうか?
993NAME IS NULL:2008/06/11(水) 11:43:52 ID:???
root ってのは、単なるアカウント(ユーザー) 名。
994NAME IS NULL:2008/06/11(水) 11:56:36 ID:???
linuxやった方がいいのでは?
995990:2008/06/11(水) 14:23:51 ID:???
>>993
なるほど。よくわかりました。ありがとうございます。

>>994
あまりリナックスはさわったことないので挑戦してみます!
996NAME IS NULL
http://dev.mysql.com/doc/
PHP の Windows Help に続き、↑の Japanese v5.1 の CHM の Windows HTML Help ファイルでも、
キーワード部分が文字化けしてたので、修正した。ヘルププロジェクトファイルとコンテンツファイルをちょびっと弄った。

欲しい人はどうぞ
ttp://toku.xdisc.net/Sn2/up3/www/re2467.zip.html