MySQL 総合 Part19

このエントリーをはてなブックマークに追加
933NAME IS NULL:2011/06/03(金) 22:16:16.99 ID:???
バッククォートってキーボードでどうやって入力すればいいのでしょうか。
Shift+@
と昨日教わりましたが、

このように表示されてしまいます。
なお、IMEはPCに入っていたものを使っています。
934NAME IS NULL:2011/06/03(金) 23:00:33.28 ID:???
` ←Shift + @
‘ ←IME on で Shift + @

結論:IME切れ、ハゲ
935NAME IS NULL:2011/06/03(金) 23:02:10.29 ID:???
IMEを切れとのことですが、切るとはどのような行為を示していますか?
切るとハゲに関係があるのかしらん?
936NAME IS NULL:2011/06/03(金) 23:43:40.88 ID:???
つまらない事聞きますけど、「PC用」「携帯用」とフィールドを分けるとき、
どういうフィールド名にしていますか?
電話番号の場合、telはPC用として、携帯はmobile_tel?ktai_tel?
937NAME IS NULL:2011/06/04(土) 00:47:10.59 ID:???
サーバのバージョン: 5.1.44-community
MySQL クライアントのバージョン: mysqlnd 5.0.5-dev

とかいうときMySQL Connector Netはどのバージョンをインストールしたらいいのでしょうか?
938NAME IS NULL:2011/06/04(土) 00:53:49.98 ID:???
>>930

そのSQLでUSE INDEXでdateとpriceの複合インデックスを指定するか、
WHERE句にprice>0を追加することで、インデックスを使ったソートが出来ました。

大変助かりました。本当にありがとうございます!
939NAME IS NULL:2011/06/04(土) 10:00:57.58 ID:???
>>936
好きなようにしたら?としかいいようがないけどw


そういう事は↓で話ししたほうが宜しいのでは?

DB設計を語るスレ 3
http://hibari.2ch.net/test/read.cgi/db/1269585561/l50
940NAME IS NULL:2011/06/04(土) 11:23:45.20 ID:m9IbrQpl
すみません。

http://www.inter-office.co.jp/contents/170/
こちらの記事を見たのですが、

InnoDBについて一番大事なことは主キーがクラスターインデックスだということです。

とのことで、
InnoDBであれば、主キーにはインデックスを設定しなくても、
勝手にクラスターインデックスが付いてインデックスを使った検索ができるという認識でいいのでしょうか。

よろしくお願いします。
941NAME IS NULL:2011/06/04(土) 11:35:47.08 ID:m9IbrQpl
>>940

の続きです。
外部キーについても、

主キー制約 ・・・一意なインデックスを生成する
外部キー制約・・・インデックスを生成する
一意制約 ・・・一意なインデックスを生成する
http://wiki.minaco.net/index.php?MySQL%2F%E5%88%B6%E7%B4%84

とのことで、
制約を付けた時点でインデックスが設定されているということでいいのでしょうか。

度々すみませんがよろしくお願い致します。
942NAME IS NULL:2011/06/04(土) 14:16:55.14 ID:???
>>941
なんかオプションをつけるとだいたいインデックスがつく
943NAME IS NULL:2011/06/04(土) 16:12:35.39 ID:???
主キーにはインデックスをはらなくてもって、
主キーこそがインデックスだと思うんだが、
自分の認識間違ってるのか。
944NAME IS NULL:2011/06/04(土) 22:24:29.98 ID:???
>>943
お前の場合は人生そのものが間違いだ
945 忍法帖【Lv=5,xxxP】 :2011/06/05(日) 00:53:12.69 ID:???
お次の質問どうぞ。
946NAME IS NULL:2011/06/06(月) 00:22:49.46 ID:???
正規化によって繰り返し項目を別表に分けた後は、どのように結合すればよいでしょうか??
SQL文を2つに分けたら解決しますが、1つで出来ないでしょうか?

table1
id,table2id,name

table2
id,data

table1id name data1 data2...
1 'abc' 'abcの趣味1' 'abcの趣味2'...
947NAME IS NULL:2011/06/06(月) 00:25:10.23 ID:???
>>937

Connector/Net, Connector/Jはクライアントライブラリ使わないので、サーバ側にあわせて何でもよいよ。
サーバ側5.1ならConnector/Netの最新版(6.3.6)でいいんじゃね?
948NAME IS NULL:2011/06/06(月) 01:26:21.99 ID:???
>>946
left join
949NAME IS NULL:2011/06/06(月) 02:55:19.06 ID:???
>>948
ありがとうございます!
結果も1行で取得したいのですが、不可能でしょうか?
それともleft join等で複数行で取得するのが一般的でしょうか?
950NAME IS NULL:2011/06/06(月) 02:58:38.79 ID:???
基本的には複数行で取得するのが一般的だな。
どのみち「abcの趣味」が複数あるわけだからプログラム側でうまく処理すればいい。
951NAME IS NULL:2011/06/07(火) 00:55:07.04 ID:???
>>950
ありがとうございます!
プログラム側で対処する事にします!
952NAME IS NULL:2011/06/07(火) 19:23:07.61 ID:Maj1FVhL
大量のSQL文の処理が終わらない…
処理を速くする方法はあるでしょうか?それとも根本的に何か間違えているのでしょうか…

http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-categorylinks.sql.gz
このファイルは解凍すると500MBになり、最初の40行でテーブルを作成して
以下INSERTを繰り返すSQL文になっています
http://pastebin.com/7s10E71y

localhostでこのsqlファイルを処理してるんですが1時間たっても終わらない…
こんなものでしょうか?


以下MySQLの使用環境です
mysql-5.1.49-3
OS: Linux (debian-squeeze)

以下実行したコマンドです
$ mysql -u user userdb < jawiki-latest-categorylinks.sql
<処理が終わらない>

最初の41行文(INSERT2行)だけならすぐに処理が終わり、SELECTで読み込まれていることが確認できました
$ head -n41 jawiki-latest-categorylinks.sql > test.sql
$ mysql -u user userdb < test.sql
953NAME IS NULL:2011/06/07(火) 20:31:30.13 ID:???
500MBでしょ?5時間もすればおわるでしょ
954NAME IS NULL:2011/06/07(火) 21:02:37.03 ID:???
>>952
見てないけど、sql文のはじめの方でインデックスを作成してる場合は、インデックスを作成せずに create table をやると多少というかかなり速くなる
で、タプルが全部 insert された後にインデックスを追加する
(たぶん、sqlファイルの最初のcreate table 文でキーの指定をしてるので、それを全部取り除く)

あと、ファイルサイズと関係なく、MySQLはタプル(行、レコード)の数が10万を超えると、検索の方も遅くなって使い物にならなくなるので、タプルが10万を超える場合は、かなり慎重に設計や最適化をする必要がある
(ちゃんとやれば、10万以上でもそれなりに速く動く)
>>952 のダンプデータは本当に MySQL のダンプなのでしょうか?
955NAME IS NULL:2011/06/07(火) 22:27:03.45 ID:???
mysql-connector-netをダウンロードしに行ってきたんですが、
メアドで[email protected]みたく前半でドットが入ると蹴られるのね。
956NAME IS NULL:2011/06/07(火) 23:42:59.31 ID:???
>>955
そりゃRFC違反だからな。弾きもするだろ。
957952:2011/06/07(火) 23:53:22.36 ID:???
>>953
まさに5時間ぐらいでした
こんなものなのかー

インデックス削れば速くできますよね、ありがとう気づかなかった
958NAME IS NULL:2011/06/08(水) 00:32:19.62 ID:???
2分48秒でロードできたよ

MySQL 5.5.11、Core i5-2400S、Intel X25-M G2 120GB
innodb_buffer_pool_size = 2G
959NAME IS NULL:2011/06/08(水) 00:44:22.69 ID:???
>>954
タプルってtableのこと?
そういう読み方流行ってんの?
960NAME IS NULL:2011/06/08(水) 00:44:29.55 ID:???
>>958
Innodb なら log buffer sizeも関係ありそう?

まぁ、質問主がどんなSQLなんかわからんけど、1行ずつ入れると遅いし
insert .... values(),(),()
は常識だよな?
961NAME IS NULL:2011/06/08(水) 00:46:21.06 ID:???
10万程度ならインデックスなくてもそれなりに早いよな。
962952:2011/06/08(水) 01:22:45.04 ID:???
ありがとおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお!
innodb_%_size 弄ったら劇的に速くなった!!
試しに↓でやってみたら5時間かかってたのが12分で終わった!インデックス削れば更に速くなるかもです。
[mysqld]
innodb_buffer_pool_size = 512MB
innodb_log_file_size = 128M

他にも複数コア使う設定とかもあるのかな?CPUパワーあまり使ってくれてない感じがする…
wikipediaが配布してるデーター読みたくてMySQL使い始めたんですが、
他にも良さそうな設定あればヒント頂けるとありがたいです。

>>960
こんなSQLでした。
http://pastebin.com/7s10E71y
963NAME IS NULL:2011/06/08(水) 06:14:20.41 ID:???
>>962
Wikipediaのデータで遊びたいなら全文検索あったほうがよくないか?
それならMyISAMになるが。日本語だとちょいと工夫がいるけど。
groongaとかで遊んで見たら?
964NAME IS NULL:2011/06/08(水) 07:56:59.67 ID:???
5時間が12分に短縮って、、、、 w
965NAME IS NULL:2011/06/08(水) 08:15:30.37 ID:???
>>959
釣りだと思うけどw
タプル=セット=組=レコード一件
966NAME IS NULL:2011/06/08(水) 09:23:01.56 ID:???
タプルって呼び方はPostgreSQLの人がよく使う印象
967NAME IS NULL:2011/06/08(水) 10:56:43.49 ID:???
ID | NAME
1 | a
2 | a
3 | b
4 | c

NAMEが重複しないIDを取得したいのですが
SELECT DISTINCT NAME FROM テーブル名
だとNAMEしか取得できなくて困っています。

すごく初歩的なことかと思うのですがヒントだけでも教えてください。
お願いしますm(__)m
968NAME IS NULL:2011/06/08(水) 11:06:14.03 ID:???
>>967
SELECT ID,NAME FROM unko GROUP BY NAME;

MySQL以外じゃろくに動かないから注意な
969NAME IS NULL:2011/06/08(水) 14:23:02.84 ID:???
タプルはtupple
英語だとテュープルに近いw
970967:2011/06/08(水) 15:02:33.22 ID:???
>>967
ありがとうございました。

GROUP BYですね。
勉強してきます!!
971967:2011/06/08(水) 15:03:39.45 ID:???
あ、安価間違いましたorz
>>968さんありがとうございました。
972NAME IS NULL:2011/06/08(水) 18:26:07.26 ID:???
>>962
他の設定次第だけど insert が多い場合は
set global innodb_flush_log_at_trx_commit=0
も速くなるよ。
これするとクラッシュしたときデータが当てに
ならなくなるので大量の insert などが終わったら
set global innodb_flush_log_at_trx_commit=1
で元に戻しておいたほうがいい。
# 手元の開発環境とかならお好きに

本番環境でも大量にある参照用スレーブとかは
この設定にしておくとレプ遅延が起こりにくかったりする。
973NAME IS NULL:2011/06/08(水) 19:39:43.77 ID:???
>>965,966,969
「ブ」じゃなくて「プ」なのか。タプルって用語を知らなかった。
974NAME IS NULL:2011/06/08(水) 23:30:24.71 ID:???
>>956

RFC5321 4.1.2. を読んで言ってるんだろうね?
975NAME IS NULL:2011/06/09(木) 00:17:04.60 ID:???
>>974
そりゃもちろん。メール絡みのRFCは全て読んだよ。
まあここはMySQLのスレだから これ以上は屋上いこうか。
976NAME IS NULL:2011/06/09(木) 00:31:55.62 ID:???
>>975

顔から火が出るほど恥ずかしくなって屋上から飛び降りるってか?

読んだだけでまるで理解していないというのはかなりたちが悪いんだよね。
何事も半可通が一番迷惑なんだよ。
977NAME IS NULL:2011/06/09(木) 02:09:31.75 ID:???
>>976
半可通って久し振りに聞いた。
978NAME IS NULL:2011/06/09(木) 09:24:02.27 ID:???
id, col, value
1, n, apple
1, c, red
2, n, banana
2, c, yellow
3, n, grape
3, c, green
3, w, 100

のような、各ID番号、列記号、値の入ったテーブルがある時、
id, n, c, w
1, apple, red, NULL
2, banana, yellow, NULL
3, grape, green, 100
のような出力を得たければ、どうするのが定石でしょうか。

979NAME IS NULL:2011/06/09(木) 09:39:34.39 ID:???
ドットを使うくらいじゃRFC違反にはならないからね
980NAME IS NULL:2011/06/09(木) 10:32:13.01 ID:???
>>978
たぶんこんな感じ。
select a.id, a.value, b.value, c.value
from table a left join table b left join table c
where a.id=b.id and a.id=c.id
981NAME IS NULL:2011/06/09(木) 18:44:21.83 ID:???
>>980
やっぱり列の数に応じて必要なだけjoinするしかないんですかね…。
982980
間違えた。こうか?

select a.id, a.value, b.value, c.value
from table a
left join (select * from table where col='n') b
left join (select * from table where col='c') c
where a.id=b.id and a.id=c.id;