のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,296人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレ【MySQL】下らねぇ質問はID出して書き込みやがれ 2

    mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    302 : 297 - 2012/03/25(日) 21:15:08.72 ID:0c4g4u0j (+26,+28,+0)
    わーーーーーできました!!!!みなさんありがとうございました!!!!!!!!!!
    303 : NAME IS - 2012/03/25(日) 21:42:21.17 ID:??? (+14,+26,+0)
    よかったね
    305 : NAME IS - 2012/03/28(水) 23:25:58.20 ID:??? (-10,-30,+0)
    MySQLのロックについて教えてください

    環境:5.0.87 (tritonnですが、tritonnに起因する問題ではないです)

    2つのInnoDBストレージのテーブルからMyISAMテーブルへINSERTするクエリを発行すると
    元のInnoDBテーブルにロックが発生するときがあります。

    クエリはこんな感じ
    -----
    INSERT INTO myisam_table ( field1 , field2)
    SELECT i1.A, FN(i2.B)
    FROM innodb_table1 i1
    INNER JOIN innodb2_table i2 ON i1.id=i2.id
    -----
    FNはテキストを変更するストアドファンクションです
    myisam_tableはインデックス等の設定はありません(のでtritonnの問題ではないです)
    innodb_table1,innodb_table2は1対1でパーティションを分けただけです(id列はキー列)

    上記のSQLを実行中に、innodb_table1へのINSERTがロック解除待ちになるときがあります。
    ダーティーリードOK、ファントムリード大歓迎という一貫性無関係なクエリなので、分離レベルを
    READ UNCOMMITTEDにしてもinnodb_table1へのINSERTクエリがロック解除待ちになりました。

    FNがちょっと時間のかかる処理なので、10万レコードを処理すると2時間ぐらいかかります。
    それでロックが発生していることが分かったのですが、READ UNCOMMITTEDにしているのに
    ロックが発生していることがどうしても理解できなく、対策も思いつきません
    #そもそも書き込み先はMyISAMなのに何でロックが?という疑問も…

    一貫性保持のロックはまだ分かるのですがですが、READ UNCOMMITTEDで一貫性を放棄したのに
    それでもロックが発生する理由が分かりません…
    306 : NAME IS - 2012/03/29(木) 00:25:10.26 ID:??? (+42,+29,-54)
    >>305
    トランザクション分離レベルに関わらず、「更新」は「更新」をブロックする。
    そのINSERT … SELECT文は一見「参照」に見えるけど
    内部的には「更新」扱いされるんじゃないかなあ。
    307 : 306 - 2012/03/29(木) 00:31:38.87 ID:??? (-27,-30,-37)
    補足だけどMySQL 5.5を検証環境に入れて、処理中に
    information_schema.INNODB_TRX、INNODB_LOCKS、INNODB_LOCK_WAITS
    あたりを見ると分かるはず。
    310 : 305 - 2012/03/30(金) 00:05:17.86 ID:??? (-21,-30,-162)
    >306-308
    有難う。
    指摘された箇所読み直して、ようやく理解した。(ような気がする)

    myisam_tableへのINSERTは一貫性関係ないからREAD UNCOMMITTEDと考えてたけど、
    innodb_table1/2にはREAD COMMITTED以外だとロックがかかるのね…
    質問したinnodb_table1 へのINSERTのロック待ちが起きているクエリのトランザクションの
    レベルはデフォルトのRPEATABLE READ。ロック待ちになっても仕方ないですね

    「それ以外の場合、InnoDB は S から取得した行に共有ネクストキーロックを設定します」の
    「それ=READ CMMITTED」以外というのはREAD UNCOMMITTEDも含むんだろうなぁ
    314 : NAME IS - 2012/03/31(土) 18:26:58.95 ID:??? (+18,+29,-17)
    >>313
    分けないとだめ
    みんな自社用フレームワーク作ったりしてるんだと思う
    315 : NAME IS - 2012/03/31(土) 19:21:34.22 ID:ocTAzuV3 (-7,+29,-54)
    >>314
    レスありがとうございます
    という事は、レプリケーションした場合、参照系と更新系を混ぜたトランザクションなんてことは
    無理で、トランザクション時のみ更新系DB(マスター)だけを対象に接続することになるんですか?
    316 : NAME IS - 2012/03/31(土) 19:33:50.67 ID:??? (+31,+29,-32)
    >>315
    YES。
    自分でシステムの要件を決められるWeb企業だからできる設計であって、
    顧客が要件を決める受託システム開発で採用するのは難しいと思うよ。
    317 : NAME IS - 2012/03/31(土) 20:27:14.61 ID:??? (+29,+27,+1)
    >>316
    ありがとうございます、勉強になりました
    318 : NAME IS - 2012/04/01(日) 00:41:57.29 ID:??? (-22,-29,-60)
    レプリケーションのDBを構築するならば、
    MySQL Cluster で構築した方が可用性にも性能にも優れていると思うんだけど、
    この認識って合ってますかね?

    MySQL Clusterよりもレプリケーションの方が優れている点があれば、教えてください。
    319 : NAME IS - 2012/04/01(日) 01:02:28.54 ID:??? (+19,+29,+0)
    320 : NAME IS - 2012/04/02(月) 09:57:12.31 ID:NjGfIFoN (+30,+29,-46)
    AさんとBさんが、全く同じレコードを同時に更新したばあい
    どちらかのデータが消えてしまうことになるとおもうのですが、
    これを防ぐのにどういう方法が考えられますか?
    321 : NAME IS - 2012/04/02(月) 11:50:05.19 ID:??? (+31,+29,-7)
    >>320
    「ロストアップデート」でぐぐるといいよ
    322 : NAME IS - 2012/04/02(月) 18:48:31.43 ID:??? (-25,-20,-10)
    MySQLDumpで出力する時にwhere なりなんなりで条件で絞ることって出来ましたっけ?
    324 : 305 - 2012/04/02(月) 22:03:31.14 ID:??? (+0,-30,-203)
    ようやくネクストキーロックを理解しました
    言葉では知ってたんだけど、実際に影響を受けたことがなくて、実感がなかった。

    ところで、自分以外のスレッドの実行中クエリの分離レベルって、分かるのでしょうか。
    SHOW PROCESSLISTで実行中のクエリは確認できるけど、そのクエリがどの分離レベルなのか、ってことです。

    自分:SELECT @@tx_isolation;
    グローバル設定:SELECT @@global.tx_isolation;
    で調べることはできるけど、これでは他のスレッドは分からないです。
    #変更していなければGLOBALという予測は出来ますが…
    SHOW INNODB STATUSでも分離レベルは表示されないですよね?
    325 : NAME IS - 2012/04/03(火) 00:25:19.43 ID:??? (+0,+0,+0)
    >>324
    MySQL 5.1+InnoDB Plugin、またはMySQL 5.5以上が必要。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G
    *************************** 1. row ***************************
    trx_id: 3BCB01
    trx_state: RUNNING
    trx_started: 2012-04-03 00:22:46
    trx_requested_lock_id: NULL
    trx_wait_started: NULL
    trx_weight: 3
    trx_mysql_thread_id: 1
    trx_query: NULL
    trx_operation_state: NULL
    trx_tables_in_use: 0
    trx_tables_locked: 0
    trx_lock_structs: 2
    trx_lock_memory_bytes: 376
    trx_rows_locked: 1
    trx_rows_modified: 1
    trx_concurrency_tickets: 0
    trx_isolation_level: READ COMMITTED
    trx_unique_checks: 1
    trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
    trx_adaptive_hash_latched: 0
    trx_adaptive_hash_timeout: 10000
    1 row in set (0.00 sec)
    328 : NAME IS - 2012/04/03(火) 10:00:58.31 ID:m9gZGzcZ (+22,+29,-19)
    テーブルの中にフィールドがずらーっと登録されてますが
    あれのデフォルト表示の順番って変えれるものなんですか?
    329 : NAME IS - 2012/04/03(火) 11:22:54.78 ID:??? (-23,-30,-103)
    >>328
    テーブル定義を変えればできるけど、一般的にはあまりやらない。
    そもそも「SELECT *」をするなというのが定石。

    mysql> SELECT * FROM t;
    +------+--------+---------+
    | i_id | i_name | i_price |
    +------+--------+---------+
    | 1 | sample | 100 |
    +------+--------+---------+

    mysql> ALTER TABLE t MODIFY i_name VARCHAR(100) AFTER i_price;
    mysql> SELECT * FROM t;
    +------+---------+--------+
    | i_id | i_price | i_name |
    +------+---------+--------+
    | 1 | 100 | sample |
    +------+---------+--------+

    331 : NAME IS - 2012/04/03(火) 17:27:24.72 ID:??? (-17,-5,+0)
    できます
    332 : NAME IS - 2012/04/03(火) 18:09:49.63 ID:7cc4mfVn (-20,+29,-43)
    おおおお!本当ですか!
    MySQLに乗り換えてみます!
    ちなみにそれは何とググったら出てきます?ちょっと色々と調べてみたいんで
    333 : NAME IS - 2012/04/03(火) 19:47:57.55 ID:??? (+6,+8,-3)
    全てのテーブル同士で共有するkeyってなんだろう
    335 : 324 - 2012/04/03(火) 22:18:27.41 ID:??? (+0,+29,-111)
    >325
    ありがとうございます。5.0系だと手段はないんですね…
    5.0のサポートが終わったのは分かっているのですが、
    日本語全文検索の関係でtoritonnから離れられなくて…

    後継?のぐるんがってどうなんでしょうか?
    予算でがっつり削られたので、検証すら困難になってしまいました…
    去年(ベータ版のころ)の検証時は性能不足で却下だったのですが、
    リリースの度、機能と安定度は増したので期待しているのですが…
    337 : NAME IS - 2012/04/04(水) 20:18:58.97 ID:??? (-17,-30,-122)
    生徒の出席テーブルを作りたいのですが
    生徒IDと日付をテーブルにして、一日1回レコードに追加したいです。
    すでに存在していたら追加したくないのですが

    create table hoge(
    seito int(11),
    hiduke datetime
    );

    みたいなテーブルで
    INSERT IGNORE hoge (seito, hiduke) VALUES($seitoid, DATE_FORMAT(CURDATE(),'%Y-%m-%d'));
    としたいのですが
    seito とhidukeの両方が一致した場合はINSERTしないようにするには、どのようなテーブルにしたらよいでしょうか
    342 : NAME IS - 2012/04/07(土) 17:13:27.88 ID:??? (+21,+29,-7)
    >>341
    とりあえずはそれでいい
    応用はあとで痛い目見てからでいい
    344 : NAME IS - 2012/04/11(水) 16:36:23.19 ID:??? (+15,+27,-7)
    >>343
    元からあるテーブルをDROPして、それからインポートすれば
    うまく出来ると思います
    345 : NAME IS - 2012/04/11(水) 16:51:57.73 ID:96JSVMn0 (-12,+29,-101)
    >>344
    いや、ですからドロップ済みにして、まっさらな状態でインポートしたら
    いけるんですが、それだとリモートにたまったデータが
    全部消えてしまうでしょ?

    フィールドを増やすなどテーブルをいじる時は、まずリモートからいじって
    それからローカルに移す(ローカルならまだ全部消しても問題ない)
    しかないですかね。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について