MySQL 総合 Part18

このエントリーをはてなブックマークに追加
937NAME IS NULL:2011/01/07(金) 18:25:03 ID:???
普通に不等号で比較するようにした方がいいね
検索対象を変換してちゃ速度はまったく稼げんよね
938NAME IS NULL:2011/01/07(金) 21:49:32 ID:???
変換関数使うとコーディングは便利だけどインデックス効きません
939NAME IS NULL:2011/01/08(土) 20:09:12 ID:???
ハイスコア表示したいのですが
scoreというintの中から
点数が高い方から10件取得とかってどうやればいいのでしょうか
940NAME IS NULL:2011/01/08(土) 21:12:31 ID:???
>>939
まずはSQLの基本でも勉強してから・・・
941939:2011/01/08(土) 22:28:59 ID:???
え?SQLのスレじゃないんですか?
942NAME IS NULL:2011/01/08(土) 22:49:29 ID:???
select score from table_name order by score desc limit 10;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

言葉足らずで申し訳ありません。

テーブルを参照するプログラムは
データの集計を行うプログラムになります。
Aというテーブルではバッチからの更新が終了しているけれど
Bというテーブルではまだバッチで更新中となっている場合
HOGEというプログラムが両方のテーブルの情報を集計するとなると
テーブル間の不整合が発生するのでトランザクションを使用しています。

そして今回はバッチで登録・更新をするテーブルの数が多いので
>>962にあるような質問をさせていただきました。
965NAME IS NULL:2011/01/14(金) 14:59:43 ID:???
HOGE というプログラムが、テーブルAとテーブルBを参照するんですね?
そのHOGEというプログラムが、テーブルAとテーブルBに登録処理をしている最中でも稼動するんですね?

HOGE というプログラムがシステムの中で重要度が高いのであれば…

テーブルAとテーブルBにデータを登録する際には、HOGEというプログラムを考慮して、
テーブルAとBへのデータ登録は両テーブルの整合性が取れている状態として1件ごとに処理をする。

そんな方法を検討する可能性も有ります。

述べられている「参照するプログラム」が出力する結果が、そのシステムでどれだけ重要であるかを考慮する必要があります。

逆の意味で述べれば、テーブル更新が終了する前に、システムとして重要な出力結果を出すHOGEを実行しない、これが適切だとも言えます。
966NAME IS NULL:2011/01/14(金) 15:04:48 ID:???
初歩的な質問ですが探してもわからなかったので質問します
MySQL5.1をInnoDB Pluginで使っていますが、
1つのテーブルのカラム数は大体このくらいまでにしておいた方が良い、ってのはありますか?
扱うデータが多くて、素直に組むとカラム数が200ぐらいになるのですが
これが1億レコードぐらいになると、パフォーマンスに結構影響しますか?
経験がなくてわからないので、皆さんの意見を聞きたいです
967NAME IS NULL:2011/01/14(金) 15:33:55 ID:???
>>966
InnoDBは8KBのレコード長制限がある。
VARCHAR、TEXTなど長いカラムはページ外に保存されるのだけど、
200カラムは作れない可能性が高いので事前に確認しないとだめ
作れるなら性能はそんなに気にしなくてもよい
968NAME IS NULL:2011/01/14(金) 20:46:10 ID:???
>>964
別にバッチ処理中か確認するようにすれば?
別テーブルにフラグみたいなもん立てるとか。
969NAME IS NULL:2011/01/15(土) 15:13:56 ID:???
素直にトランザクションで解決してなにが悪いのかワカラン。
コミットに時間がかかってもバッチ処理なら問題ないだろうし。
970NAME IS NULL:2011/01/15(土) 22:10:40 ID:???
ユーザー作成時に

CREATE USER <ユーザ名> IDENTIFIED BY '<パスワード>';

この時に同時に権限を設定するという事は出来ないのですか?これはあくまでもユーザーを作成するだけで
権限付与は従来からのgrant文でということ?
971NAME IS NULL:2011/01/16(日) 00:53:13 ID:???
役立たずの古い技術者です。

バッチプログラムからデータベースのデータ処理をするときに、
カーソルを使って、1件ずつ読みだして処理する。。
という、昔ながらの手法があります。

MySQLで同じような処理を行おうと思いましたが、
カーソルに対応していないことを知りました。

カーソルのフェッチに相当する処理をCライブラリで
実現しようと考えていますが、結果セットを取得するAPIでは
処理実現が厳しいかな?と考えています。

Mysql_store_result()は結果セットをローカルに保存するので、
結果が大量になったとき、メモリ不足が発生しそうで、
枕を高くして眠れません。

Mysql_use_result()は1件読み出しが実現できますが、
対象のテーブルがロックされるとマニュアルに記載があります。
検索範囲や分離レベルによらずに、です。
これでは、バッチ処理が終わるまで他の処理が継続できなくなります。

あとは、mysql_stmt系のサーバ再度カーソルがあるようですが、
サーバ側のメモリを大量消費&閾値こえるとMyISAMにデータコピーする
仕様になっており、ちょっと手を出すのをためらわれます。

MySQLで大量データを保管するテーブルで、バッチで範囲指定(これも大量にヒットする)
してデータ抽出し処理したい場合、どういう処理をしているのでしょうか?


972NAME IS NULL:2011/01/16(日) 01:10:49 ID:???
範囲指定をsqlのselectで指定して
後はupdateするだけじゃね?
行指定ならlimit使うだけ
何がわからんの?
973NAME IS NULL:2011/01/16(日) 01:28:49 ID:???
>>971
サーバサイドのmysql_stmt_fetch()使うしかない気がする。
大きな結果セットでMyISAM使うとしても
それってOracleでORDER BY、GROUP BYなどによって一時テーブル使うのと
そんなに変わらない、といいね

>>972
LIMIT 0, 100
LIMIT 100, 100

というのは案としてあると思う。
けどACIDとるために最初にテーブルロックせざるをえない
974NAME IS NULL:2011/01/16(日) 02:00:34 ID:???
>>971

> カーソルを使って、1件ずつ読みだして処理する。。
> MySQLで同じような処理を行おうと思いましたが、
> カーソルに対応していないことを知りました。

あなたの言われている「カーソルに対応していない」とは、何を指しているのか理解できません。

975NAME IS NULL:2011/01/16(日) 02:17:05 ID:???
>>974
カーソル知らないの?
1行ずつフェッチして、更新したりできるんだよ、大量データを逐次処理できるの
976NAME IS NULL:2011/01/16(日) 03:41:36 ID:???
> カーソルに対応していない

カーソルは知っているけれども、対応していないが漠然としているのでは?
977NAME IS NULL:2011/01/16(日) 11:06:21 ID:P3g9vKaN
>>971
>カーソルに対応していないことを知りました。


あなたの使ってるMySQLはカーソルに対応していない
だろ。正確に書いてよ
978NAME IS NULL:2011/01/16(日) 12:47:41 ID:???
>>971
カーソルに対応しているmysqlがあるとでも?
979NAME IS NULL:2011/01/16(日) 15:01:37 ID:???
980NAME IS NULL:2011/01/16(日) 17:29:08 ID:???
>>979
それ、ストアドだって。
もともと、Cライブラリでカーソルとかいうことじゃね?
981NAME IS NULL:2011/01/16(日) 19:46:45 ID:???
問題は、MySQLの通信プロトコル上、非prepare系のAPIでは
SQLを実行した瞬間に結果の全件がクライアントに送られるところ。
MySQLのカーソル操作はクライアント上でエミュレーションしているに過ぎない。
だからSELECT結果が5GBとかに達する場合、クライアントが32bitだと処理できない。

他のRDBMSでは「次のレコードをよこせ」というリクエストを送って
数十レコードごと逐次結果が返されるようになっている。

mysql_stmt_prepare()系は逐次レコードを返すはずだけど
そもそもMySQLでそういうバッチ処理を書く人があまりいないので
ノウハウが少ない。
982NAME IS NULL:2011/01/17(月) 10:30:41 ID:???
ウェブ系以外でMySQLよりPostgreSQLが使われるケースが多い理由のひとつ。
983962:2011/01/17(月) 10:58:33 ID:???
>>965
レスありがとうございます。
>HOGE というプログラムが、テーブルAとテーブルBを参照するんですね?
そうです。
>そのHOGEというプログラムが、テーブルAとテーブルBに登録処理をしている最中でも稼動するんですね?
そうです。

>テーブル更新が終了する前に、システムとして重要な出力結果を出すHOGEを実行しない、これが適切だとも言えます。
こちらの方法を検討してみようかと思っています。
ただ、バッチは30分近くかかりそうなので、
その間HOGEが実行されないのが業務用件的にNGになりそうな気配もあります。


>>968
ありがとうございます。
その方向で少し検討してみます。

>>969
大量のデータを登録・更新するときって
トランザクションをずーっと貼りつづけていると
すこぶるパフォーマンスが落ちることってありませんか?
あ、バックグラウンドのバッチだからそんなの気にしなくてもいいじゃないかって
ことでしょうか?
984NAME IS NULL:2011/01/17(月) 11:55:38 ID:???
>>983
> >>969
> 大量のデータを登録・更新するときって
> トランザクションをずーっと貼りつづけていると
> すこぶるパフォーマンスが落ちることってありませんか?

InnoDBのMVCCはそこまでアホな実装じゃない。
バッチだから仮に遅くても気にしなくていいってのはそう思うし。
985NAME IS NULL:2011/01/17(月) 22:53:41 ID:NkbyBHZG
レプリケーションで、スレーブで起動されるSQLスレッドの数は
1スレッドのみなんでしょうか?
986NAME IS NULL
1スレッドのみです