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

    私的良スレ書庫

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

    元スレMySQL 5.0

    mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    401 : NAME IS - 2009/05/19(火) 09:27:40 ID:???.net (-2,-29,-24)
    >>398
    mysqldumpはmysqlクライアント上のコマンドじゃなくて
    単体のプログラムだ
    402 : NAME IS - 2009/05/19(火) 16:26:07 ID:???.net (+57,+29,+0)
    >>401
    ありがと
    ばっちりできました
    403 : NAME IS - 2009/05/19(火) 18:06:12 ID:???.net (+0,-29,-25)
    >>399
    再帰が無いSQLで書く技を使えば他のSQLに乗り換えるときコード修正不要?
    404 : NAME IS - 2009/05/19(火) 22:03:06 ID:???.net (+24,-8,-15)
    他のSQLにも色々あるしなぁ。
    シンプルなselectひとつ取っても、
    例えばSQLiteでは使えるカラム名が
    MySQLでは予約語だったりするしなぁ。
    405 : NAME IS - 2009/05/20(水) 08:40:18 ID:???.net (+27,-3,+0)
    >>404
    キーワードじゃない語は全部ちゃんと
    クォートすれば。
    406 : NAME IS - 2009/05/20(水) 17:58:15 ID:???.net (+47,+29,+0)
    気本棚
    408 : NAME IS - 2009/05/23(土) 21:35:18 ID:???.net (+0,-28,-14)
    1234abcなんかしらないとエラーが言っている
    409 : NAME IS - 2009/05/23(土) 22:13:08 ID:???.net (-1,-29,-28)
    先に
    create database 1234abc;
    をする
    410 : NAME IS - 2009/05/24(日) 11:57:46 ID:zGV2NEj3.net (+13,+18,-40)
    便乗質問です。
    mysqlってダンプファイルの中身見て、ロード先のDBに必要な
    データベースがなかったら自動的に作成してくれるもんじゃないの?
    411 : NAME IS - 2009/05/24(日) 12:30:22 ID:???.net (+56,+23,-102)
    ダンプファイルってつまり単なる普通のSQLの塊だから
    データをINSERTする前にテーブルをDROPしてCREATEするだけ。
    それがダンプしたSQLの先頭にあるかないかの問題で、
    MySQL側がどうこう言うことではないと思うが。
    ダンプするツールが対応するか、もしくは手書きすべきだ。
    413 : NAME IS - 2009/05/31(日) 10:28:51 ID:???.net (+49,+29,-21)
    >>412
    まったく問題ないと思うけど。。。
    単なるPHPコードだよ? 何かあるわけない。
    414 : NAME IS - 2009/06/01(月) 23:16:57 ID:???.net (+3,-30,-221)
    助言をいただきたいのですが…。

    SELECT t1.id, t1.data, t1.update FROM table_name t1
    WHERE t1.update = (SELECT MAX(t2.update) FROM table t2 WHERE t1.id = t2.id)

    これは、重複するidを持つレコードが複数あるテーブルから、
    更新日updateの一番大きいレコードだけをかいつまんで取得するSQL文です。

    ここにさらに条件を加え、各idの「一番小さいupdate」をキーにソートしたいのですが、
    効率の良いSQL文が書けません。

    アドバイスをいただければありがたいです。
    (グループ化とかいいつつ、結局GROUP BY使わない方法でやってますが…;)
    415 : NAME IS - 2009/06/01(月) 23:23:24 ID:???.net (+61,+27,-5)
    idと更新日のペアがタブっていたらどうするの?
    416 : NAME IS - 2009/06/01(月) 23:29:24 ID:???.net (+8,-30,-196)
    SELECT
     t1.id, t2.data, t1.max_update AS update
    FROM
     (SELECT
      id, MAX(update) as max_update, MIN(update) as min_update
      FROM table_name GROUP BY id) t1,
     table_name t2
    WHERE
     t1.id = t2.id AND t1.max_update = t2.update
    ORDER BY
     t1.min_update
    417 : NAME IS - 2009/06/02(火) 10:48:25 ID:???.net (+63,+29,-17)
    >>415
    idと更新日のペアは一意になるようになっています。

    >>416
    ありがとうございます!
    とても勉強になります。
    418 : NAME IS - 2009/06/02(火) 11:23:58 ID:???.net (+12,-29,-113)
    PHP から MySQL を使っています。
    SELECT で varchar(2000) の値を取得するときのことなのですが、
    PHP 側ではこの値の冒頭200文字程度しか利用しないと分かっているとき、
    はじめから SUBSTRING で値を削って取得するメリットは小さいでしょうか?

    一般に MySQL で余計な関数を使うと処理が遅くなると聞きますので、
    こういった文字列処理は値を取得しておいてPHP側でしたほうがよいですか?
    なんとなく、あらかじめ削っておけばメモリの消費が抑えられるのではないかという考えがよぎって迷っています。
    419 : NAME IS - 2009/06/02(火) 13:02:24 ID:???.net (+26,-29,-117)
    グループ化についてもう一つ助言をいただきたいのですが…。

    GROUP BY AAA, BBB

    これは、AAAとBBBが同一のものをグループ化すると理解しています。
    そうではなく、AAAでグループ化して、さらにそれをBBBでグループ化する、
    のようにGROUP BYを入れ子にするには、どのようなクエリを書けば実現できるのでしょうか?
    420 : NAME IS - 2009/06/02(火) 13:41:43 ID:???.net (+71,+29,-185)
    >>418
    考え方による。
    大規模なwebアプリなら、圧倒的にPHP側で処理すべきと思う。
    あなたの力量にもよるけど、突き詰めると、DB側で処理するメリットは無い。

    DB側で処理すれば、結果セットが巨大でもデータ転送が速く、かつ省メモリ。
    しかし、データが永続的に増える条件下での削減量はたかが知れてる。

    DB側で処理すれば、PHPコードがシンプルになる。
    しかし、マルチバイト文字の扱いが微妙だし、潰しが聞かない処理(リクエスト、関数、etc)が増える。

    DB側で処理すれば、クエリキャッシュが効けば1回限りの処理で済む。
    しかし、処理済みデータをオンメモリキャッシュしたほうが、もっと速い。

    DB側で処理すれば、PHP側の処理が軽くなる。
    しかし、DBよりPHPのほうが簡単にスケールできる場合が多い。

    こんな感じでいかがかしら。
    421 : NAME IS - 2009/06/02(火) 13:51:14 ID:???.net (+3,-30,-76)
    >>419
    SELECT * FROM (SELECT * GROUP BY AAA) GROUP BY BBB

    ただしAAAでグルーピングした時点でBBBの内容は不定になっている。
    これで目的が達成できているか、不明。
    422 : NAME IS - 2009/06/02(火) 14:40:11 ID:???.net (+37,+12,+1)
    >>419
    不可能。
    423 : NAME IS - 2009/06/02(火) 18:38:46 ID:???.net (+43,+12,-18)
    >>419
    >AAAとBBBが同一のものをグループ化
    えー、そうだっけ?
    424 : NAME IS - 2009/06/02(火) 19:28:58 ID:???.net (-1,-29,-34)
    GROUP BY AAA, BBB がそうだろ?
    425 : NAME IS - 2009/06/02(火) 22:06:54 ID:???.net (+61,+29,-45)
    >>419
    GROUP BYを入れ子にって、いったいどういう結果を期待してんの?
    勝手な言葉で質問しても解釈がまちまちだからごらんの有様だよ。
    426 : NAME IS - 2009/06/03(水) 23:00:07 ID:???.net (+49,+11,+1)
    >>420
    ありがとうございます!!
    427 : NAME IS - 2009/06/17(水) 20:22:30 ID:???.net (-1,-29,-41)
    accessから移植したいんだけど、最後に;をつけるだけでおk?
    create tableなんかはtype=InnoDB;つけないとだめ?
    428 : NAME IS - 2009/06/17(水) 21:07:07 ID:???.net (+59,+29,-15)
    データ型そんなに互換性ないだろう
    全部見直さないとダメ
    429 : NAME IS - 2009/06/17(水) 23:21:33 ID:???.net (-1,-29,-12)
    access使うようなのがトランザクション処理が必要なのだろうか…
    myisamでいい気がするがなあ
    430 : NAME IS - 2009/06/18(木) 20:31:27 ID:???.net (+23,-29,-53)
    >>428
    大幅に見直すのはcreateのところだけじゃ不十分かな?
    select,insert,updateの構文は;つければ使えない?
    431 : NAME IS - 2009/06/19(金) 12:45:53 ID:???.net (+4,-30,-91)
    selectで、○番目と○番目のレコードを取得、ってしたいんですが、
    limitで複雑な指定できませんよね?
    サブクエリを駆使するしかありませんか?

    イメージとしては、こんな感じに指定したいんです。
    SELECT * FROM table LIMIT (0, 1 AND 5, 1)
    432 : NAME IS - 2009/06/19(金) 12:51:14 ID:???.net (+59,+29,-19)
    >>430
    見直しが極めて望ましい。
    DBは意外と互換性がないので。
    433 : NAME IS - 2009/06/19(金) 12:54:58 ID:???.net (+7,-30,-45)
    >>431
    UNIONがおすすめ。

    (1つ目のクエリ LIMIT 0,1) UNION (2つ目のクエリ LIMIT 5,1)

    いくつ繋げてもindex効くし、綺麗。
    434 : NAME IS - 2009/06/19(金) 13:47:54 ID:???.net (+60,+29,-37)
    >>433
    ありがとうございます!
    各クエリともLIMIT部分以外が同一であっても、
    やはりクエリの数だけ走査しなおしてしまうのですよね?
    435 : NAME IS - 2009/06/19(金) 17:54:37 ID:???.net (+3,-30,-119)
    SELECT SUM( p.point )
    FROM point_table p
    GROUP BY p.id
    ORDER BY SUM( p.p.point ) DESC
    LIMIT 100

    これは、各idのもつpointの合計値を、pointの多い順に上位100件取得するクエリです。
    ここで得られるpointの合計値を求めたいのですが、
    上のクエリをどのように修正すれば良いのでしょうか?
    436 : NAME IS - 2009/06/19(金) 18:43:32 ID:???.net (+15,-29,-4)
    >>434
    つ EXPLAIN

    また、一時テーブルをつくる方法も。
    437 : NAME IS - 2009/06/19(金) 19:38:32 ID:???.net (+59,+29,-15)
    >>436
    なるほど、一時テーブルですか。検討してみます。
    ありがとうございます!
    438 : NAME IS - 2009/06/20(土) 09:28:26 ID:???.net (+60,+29,-16)
    >>430
    そのまま移植して動かして見てエラーが出たらなおせばいい
    439 : NAME IS - 2009/07/03(金) 12:40:09 ID:???.net (+3,-30,-249)
    MySQL を勉強中なのですが、クエリの最適化について悩んでいます。

    SELECT d.date, i.ip, n.name
    FROM update_log d
    LEFT JOIN update_log i USING(id)
    LEFT JOIN update_log h USING(id)
    WHERE d.id = 100
    AND i.ip IS NOT NULL
    AND n.name IS NOT NULL
    ORDER BY d.date DESC, i.date DESC, n.date DESC
    LIMIT 1

    『条件』
    ・update_log テーブルから、指定した id に該当するレコードのdate, ip, nameを取得する
    ・ただし、ip, name の各項は NULL 値が入っている可能性がある
    ・NULL 値ではない、もっとも date が大きいレコードを各項について取得する

    上記クエリだと、取得にかなり時間がかかってしまうため、
    よりよいクエリを発行したいのですが、よいアイディアが生まれません。
    助言いただけましたらうれしいです。
    440 : NAME IS - 2009/07/03(金) 13:04:22 ID:???.net (+62,+29,-47)
    nとhが混ざってね?

    それは置いといて、クエリよりインデックスの張り方の問題じゃないかな。
    それぞれのテーブルに複合インデックスを張れば
    普通に激速になりそうな気がする。
    441 : NAME IS - 2009/07/03(金) 13:13:46 ID:???.net (+15,-16,-36)
    いや、よく見るとクエリも変?
    LEFT JOINいらなくね? 違うか?
    442 : NAME IS - 2009/07/03(金) 13:26:49 ID:???.net (+62,+29,-25)
    それ自己結合する意味あんの?
    条件の1つ目と3つ目なんて違う話だし
    443 : NAME IS - 2009/07/03(金) 15:08:14 ID:???.net (+70,+29,-75)
    レスありがとうございます。

    >>440
    すみません、一個所 n が h になっていました。
    インデックスは EXPLAIN 見ながら貼り直したりしてみたのですが、
    特に変化はみられませんでした。

    >>441
    >>442
    それぞれの値を取得するために、
    3つばらばらにシンプルなクエリを発行したほうが良いということでしょうか?
    444 : NAME IS - 2009/07/03(金) 15:41:51 ID:???.net (+3,-30,-153)
    すみません、そもそもクエリが条件に合致していませんでした。

    SELECT d.date, i.ip, n.name
    FROM update_log d
    LEFT JOIN update_log i ON (i.id = d.id)
    LEFT JOIN update_log n ON (n.id = d.id)
    WHERE d.id = 100
    AND i.ip IS NOT NULL
    AND n.name IS NOT NULL
    ORDER BY d.date DESC, i.date DESC, n.date DESC
    LIMIT 1
    445 : NAME IS - 2009/07/03(金) 19:52:22 ID:???.net (+4,-30,-82)
    サブクエリ使ってください

    select l1.date, l1.ip, l1.name
    from update_log l1
    where id = <入力値>
    and date = (
    select max(l2.date)
    from update_log l2 where l1.id = l2.id
    and l2.ip is not null
    and l2.name is not null
    )
    446 : NAME IS - 2009/07/03(金) 21:14:10 ID:???.net (+5,-23,-5)
    >>445
    それだと全フィールドがnullのレコードが選択されるんじゃね
    447 : NAME IS - 2009/07/04(土) 00:15:52 ID:???.net (+62,+29,-35)
    アドバイスありがとうございます。

    いろいろ試した結果UNIONでつなげることで落ち着きました。

    はじめのクエリだとなぜだめなのかが、よくわかりません。
    500行のテーブルに対して10秒近くかかってしまっていました。
    クエリのどこに原因があるのか、おわかりになる方いましたら、
    ぜひ教えてください。m(_ _)m
    448 : NAME IS - 2009/07/07(火) 17:41:36 ID:???.net (+6,-29,-31)
    二つのDATETIME型の差をTIMEDIFF関数を使って求めたのですが、838時間以上は丸められてしまいます。
    正確な秒数を求める方法はありますか?
    449 : NAME IS - 2009/07/08(水) 18:44:51 ID:???.net (+57,+28,-1)
    >>448
    time型ではそれ以上の時間は扱えない。
    450 : NAME IS - 2009/07/17(金) 22:48:11 ID:???.net (+0,-27,-40)
    あるレコードを DELETE するのと
    あるレコードの主キーを UPDATE するコストっていうのはあまり変わらないですか?
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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