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

    私的良スレ書庫

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

    元スレMySQL 総合 Part24

    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
    201 : NAME IS - 2013/11/14(木) 19:23:45.43 ID:???.net (+0,+29,-26)
    >>195
    それってZEROFILL属性つけた時に何桁で揃えるかで、実際何桁格納できるかには関係なかったかと。

    http://dev.mysql.com/doc/refman/5.6/en/numeric-type-attributes.html
    202 : NAME IS - 2013/11/14(木) 21:56:52.94 ID:0ShVoWYr.net (-3,-30,-116)
    最近DBを学び始めた者ですが、複数テーブルをLEFT JOINして条件を付けた際の順序はどうなるのでしょうか?

    例えば
    SELECT * FROM a LEFT JOIN b USING (id) LEFT JOIN c on b.no = c.no WHERE c.no IN ( 1,2,3);

    の場合、aにb→cの順でjoinし、最後にwhereの条件で絞るのでしょうか?
    それとも、a→b joinの後に、where → c joinとなるのでしょうか?

    どなたか教えて下さい。
    203 : NAME IS - 2013/11/15(金) 07:17:38.18 ID:???.net (-11,+30,+0)
    204 : NAME IS - 2013/11/15(金) 09:18:33.63 ID:???.net (+52,+29,-21)
    >>202
    他のRDBMSは知らないが、都度オプティマイザーがどっちが効率的かを判定して決める。
    205 : NAME IS - 2013/11/15(金) 09:50:39.22 ID:???.net (+56,+29,-21)
    >>202
    他のRDBMSは知らないが、都度オプティマイザーがどっちが効率的かを判定して決める。
    206 : NAME IS - 2013/11/16(土) 14:48:08.36 ID:???.net (+7,-30,-123)
    インデックスについての質問です。マルチカラムインデックス作成するのってクエリ早くする上での対策として定石なんですか?

    select * from hogehoge where a = 1 order by b limit 10;

    とかのクエリはaとbのマルチカラムインデックス張らないとaのインデックスしか有効にならないって認識なんですが合ってますかね?

    PostgreSQL普段使っててちと勉強中です。
    207 : NAME IS - 2013/11/16(土) 14:59:59.80 ID:???.net (+5,-29,-4)
    >>206
    explain して比較してみればいいんじゃないの。
    208 : NAME IS - 2013/11/16(土) 15:29:08.58 ID:???.net (+27,-29,-78)
    >>207
    explainしてインデックスの利用状況確認してるんですが、一回のソートで一つのインデックスしか使われないんですね・・・。
    実際にはjoinしてwhere かけているsql文なのですが、マルチカラムインデックスを作成してもuse index句を入れないとマルチカラムインデックスが使われませんでした。

    設定とかでマルチカラムインデックスを優先して使ってもらう方法ってありますか? 特定のORM使ってるので、use index入れるのが辛いので・・・。
    209 : NAME IS - 2013/11/16(土) 15:42:34.74 ID:???.net (+75,+10,-18)
    >>208
    それはデータの中身や量の問題だよ

    プランナがインデックスよりスキャンのほうが好ましいと思えばそうなる

    設定だとrandam_costいじれば良いが、ここMySQL板だぞ
    210 : NAME IS - 2013/11/16(土) 15:52:38.74 ID:???.net (+68,+29,-89)
    .>>209
    すいません、言葉足らずでした。PostgreSQLを普段使っててMySQLを勉強中という意味です。
    案件でMySQLが多いので運用のノウハウとか知りたくて色々弄ってる最中です。
    211 : NAME IS - 2013/11/17(日) 01:55:40.09 ID:???.net (+3,-30,-61)
    MySQLって結構クセがあるんですね。↓のようなクエリはインデックス使われないから別の方法考えた方がいいですよね?

    select * from A inner join B on A.b_id = B.id where B.colum1 order by A.create_date;
    212 : NAME IS - 2013/11/17(日) 01:56:24.40 ID:???.net (+42,-30,-47)
    間違えた・・こっちでした。

    select * from A inner join B on A.b_id = B.id where B.colum1 = 'hogehoge' order by A.create_date;
    213 : NAME IS - 2013/11/17(日) 02:08:55.11 ID:???.net (+43,+5,-4)
    >>212
    DDLも書かずにそう言われても答えようがない
    214 : NAME IS - 2013/11/17(日) 09:41:57.03 ID:???.net (+39,-2,-5)
    >>212
    use indexはどうなった?利用したらどうなんだ?
    215 : NAME IS - 2013/11/17(日) 09:45:39.79 ID:???.net (+11,-29,-127)
    Oracle、PostgreSQLなど他のRDMSからMySQLに移動してきて
    移行が成功したって思った後に最初につまづくのが大体
    order by、group byや複合カラム等へのインデックスの適用がされていなくて
    パフォーマンスがた落ちってとこだからな。要注意
    216 : NAME IS - 2013/11/17(日) 11:57:28.11 ID:???.net (+12,-30,-246)
    >>213
    すいません、DDLはこんな感じです。

    create table A (
    id integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    create_date datetime
    );

    create table B (
    id integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    column1 varchar(64)
    );

    >>214
    ORM使ってる都合上、あんまりやりたくなかったです。でも使うのが定石なら仕方ないですね。

    >>215
    まじでそうですね・・・。ノウハウ積めればいいので良い経験にはなりますが、業務でこれはやりたくない・・。


    ちなみにPostgreSQLに対してMySQLが優位なのって下記の点だと思ってるのですが他にありますか?
    ・同時接続数が増えてもパフォーマンスの劣化が起こりにくい
    ・レプリケーション機能が枯れているので安定性があり、情報がそこらじゅうに転がっている
    ・パーテショニングが比較的使いやすい
    ・設定が楽

    オプティマイザが改良されてるMariaDBで試してみます。
    217 : NAME IS - 2013/11/17(日) 12:56:26.95 ID:???.net (+6,-29,-18)
    >>216
    a.create_dateにインデックス作れ。
    オプティマイザーの問題以前に、存在しないインデックスは選びようがない。
    218 : NAME IS - 2013/11/17(日) 13:51:53.09 ID:???.net (+41,-30,-52)
    >>217
    すいません、インデックスのDDL書くの忘れていました。
    a.create_dateとb.column1にはインデックス張ってます。
    マルチカラムインデックスも作成したのですが、joinとorder byを組み合わせるとuse indexを指定しないとインデックスを使ってくれませんでした。
    219 : NAME IS - 2013/11/17(日) 16:08:59.69 ID:???.net (+10,-30,+0)
    >>218
    データの問題で使ってくれないだけじゃないかな?
    うちではこういう結果になる (A.create_dateとB.column1はランダムで生成)

    mysql> SHOW CREATE TABLE A \G SHOW CREATE TABLE B \G
    *************************** 1. row ***************************
    Table: A
    Create Table: CREATE TABLE `A` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `create_date` datetime DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `A_create_date_idx` (`create_date`)
    ) ENGINE=InnoDB AUTO_INCREMENT=65521 DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)

    *************************** 1. row ***************************
    Table: B
    Create Table: CREATE TABLE `B` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `column1` varchar(64) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=262135 DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)

    mysql> EXPLAIN SELECT * FROM A JOIN B ON B.id = A.id WHERE B.column1 = CAST(RAND() AS CHAR) ORDER BY A.create_date \G
    *************************** 1. row ***************************
    id: 1
    select_type: SIMPLE
    table: A
    type: index
    possible_keys: PRIMARY
    key: A_create_date_idx
    key_len: 6
    ref: NULL
    rows: 33157
    Extra: Using index
    *************************** 2. row ***************************
    id: 1
    select_type: SIMPLE
    table: B
    type: eq_ref
    possible_keys: PRIMARY
    key: PRIMARY
    key_len: 8
    ref: test.A.id
    rows: 1
    Extra: Using where
    2 rows in set (0.00 sec)
    220 : NAME IS - 2013/11/17(日) 17:00:44.41 ID:???.net (+65,+25,-20)
    >>218
    MySQLのオプティマイザはアホの子なので、ある程度データが入ったテーブルでJOINするとかなり見誤る。

    USE INDEXでしのげるなら付けてあげて。。
    221 : NAME IS - 2013/11/17(日) 17:24:19.97 ID:???.net (+28,-30,-249)
    >>219
    有難うございます、そこまでやって頂いて感謝です。
    おっしゃる通り、どうやらデータ量(100万件ぐらい)が若干多いせいみたいでオプティマイザがインデックス使ってくれないみたいです。

    色々試してみたのですが、下記の方法でインデックスを使ってくれるようになりました。

    改善前 SELECT * FROM A JOIN B ON B.id = A.id WHERE B.column1 = CAST(RAND() AS CHAR) ORDER BY A.create_date;

    改善後 SELECT * FROM A JOIN B ON B.id = A.id WHERE A.create_date < now() and B.column1 = CAST(RAND() AS CHAR) ORDER BY A.create_date;

    思ったより面倒な対処しなくて済みそうで良かったです、有難うございます!

    >>220
    そうですね・・・ちとアホの子ですね・・・。小さい規模はPostgreSQLで、大規模はMySQLでってのが少しわかりました。
    小さい規模はORMでSQL文気にしないでプログラムしても大抵インデックス使われるけど、MySQLはオプティマイザを考慮したSQL文書かないとダメだからちょっと工数かかる、その代りスケールしやすいって感じなんですかね。
    222 : NAME IS - 2013/11/17(日) 17:55:23.84 ID:???.net (+17,-29,-103)
    >>221
    まず基本として
    USE INDEXをつけてインデックスを使うものは
    データやプランナの問題か、根本的に必要がない。
    USE INDEXをつけてインデックスを使わないものは
    DBの仕様の問題か、インデックスの貼りかたの問題

    これPostgreSQLでも常識だろうが

    で、USE INDEXをつけたときとつけないときの、応答速度はどうなんだい?

    >>221
    >小さい規模はPostgreSQLで、大規模はMySQL
    それは気のせいだ
    223 : NAME IS - 2013/11/17(日) 18:19:00.46 ID:???.net (+38,-29,-70)
    >>222
    USE INDEXをつけてインデックスが使われた場合は0.03秒、使われなかった場合は1.2秒といった結果でした。
    PostgreSQLは適当にSQL文書いても、割とインデックス使ってくれます・・・。
    224 : NAME IS - 2013/11/17(日) 19:23:22.79 ID:???.net (+95,+29,-7)
    >>223
    インデックスを使わないシークの数の上限設定ができたはず。
    225 : NAME IS - 2013/11/17(日) 23:19:03.43 ID:???.net (+66,+25,+0)
    >>224
    有難うございます、調べてみます。
    226 : NAME IS - 2013/11/18(月) 00:03:34.97 ID:???.net (+44,+16,-62)
    PostgreSQLを触っててMySQL触りだすと
    昔と違って今だと、シビアにチューニングできなければつらいだけ

    ポテンシャルはMySQLのがまだ高いけど、大体はPostgreSQLに負ける
    227 : NAME IS - 2013/11/18(月) 00:48:29.83 ID:???.net (-1,-29,-5)
    でもなんとなくgoogleとかfacebookが使ってるMySQLを使ってしまう。
    228 : NAME IS - 2013/11/18(月) 01:27:01.33 ID:???.net (+57,+29,-39)
    そりゃシビアにチューニングできる会社だからな

    同じく出来るなら使えばいいんじゃね

    ホスティングとか自社サービスじゃない系はPostgreSQLかそれベースのものが増えてるからな
    229 : NAME IS - 2013/11/18(月) 18:23:49.15 ID:???.net (+55,+27,-11)
    大規模はMySQLて何を根拠にしてんだろ?
    230 : NAME IS - 2013/11/18(月) 19:20:10.35 ID:???.net (+5,-22,-2)
    google mysql やめるって
    231 : NAME IS - 2013/11/18(月) 19:20:33.81 ID:???.net (+0,-27,-4)
    MariaDBにするってだけでしょ?
    232 : NAME IS - 2013/11/18(月) 22:11:09.31 ID:???.net (+57,+29,-23)
    自力で実装しなきゃなんないシャーディンクを
    標準機能とでも思ってるのでは
    233 : NAME IS - 2013/11/18(月) 23:41:16.44 ID:WRQu7dQ3.net (+22,+29,-31)
    というか、オラクルがスキあらば金取ろうとして超うざい。
    わざわざ会社にまで電話かけてくんなマンカス>日本オラクルの馬鹿女
    234 : NAME IS - 2013/11/19(火) 00:45:22.59 ID:???.net (+78,-29,-24)
    >>222
    > >>221
    > >小さい規模はPostgreSQLで、大規模はMySQL
    > それは気のせいだ
    元ネタはこれだな。
    http://www.slideshare.net/matsunobu/ss-28303485
    235 : NAME IS - 2013/11/19(火) 08:40:09.04 ID:???.net (+7,-20,-33)
    今となっての大きな違いはマルチスレッドかマルチコアかぐらいの違いぐらいか。
    236 : NAME IS - 2013/11/19(火) 10:16:03.29 ID:???.net (+91,+29,-10)
    クラスタリングに関してはMySQLだろう
    大規模ってそういう事じゃないの?
    237 : NAME IS - 2013/11/19(火) 10:45:52.58 ID:???.net (+70,+29,-16)
    >>236
    枯れきってるって意味ではな

    サポート頼るならpostgresのがいい
    238 : NAME IS - 2013/11/19(火) 13:08:48.11 ID:???.net (+100,+26,-57)
    >>234
    読んできた。結構知識が偏ってるようで

    2004年で日本は既にMySQL > PostgreSQLだったような
    今は逆に、世界の方がPostgreSQLの比率が多い
    239 : NAME IS - 2013/11/19(火) 13:41:47.64 ID:???.net (+99,+29,-45)
    postgresもamazon rdsでもサポート始まったしな
    MySQLはオワコン
    かといって素直にみんなMariaいくかと言えば
    「まてよ」と一度考察が入るのでそうでもない。
    オラクルのMySQLつぶしはほとんど成功だな
    240 : NAME IS - 2013/11/19(火) 14:32:02.61 ID:???.net (+112,+29,-56)
    >>239
    FaceBookが利用してるやり方やDeNAがやってることとか考えると
    MySQLじゃないとだめな用途はちゃんとある

    PostgreSQLもビッグデータ系で多々使われるようになってるし
    クラウドと実は相性が良いということもあるし

    どっちもこれからまだまだいける
    241 : NAME IS - 2013/11/19(火) 15:56:51.82 ID:???.net (+120,+30,-108)
    >>240
    >FaceBookが利用してるやり方やDeNAがやってることとか考えると
    >MySQLじゃないとだめな用途はちゃんとある

    例えばどんな? 否定でなく、単純に知りたい。

    >>238
    > 読んできた。結構知識が偏ってるようで


    俺もそう思う。大規模の定義がFBとGoogle。この2社以外はコスト的にAWSに敵わないみたいに読める。
    実際はそんな簡単じゃないんだけども。

    データを自社に置くか置かないをコストだけで判断しない業種がたくさんあるわけだが、
    そういう視点がすっぽり抜けてる。
    242 : NAME IS - 2013/11/19(火) 16:12:06.41 ID:???.net (+82,-29,-21)
    243 : NAME IS - 2013/11/19(火) 17:28:08.74 ID:???.net (+103,+29,-20)
    >>242

    いや、2010年ころの話をされても。。。。って思った訳っす。

    上のスライドの趣旨としては、2000年-2005年くらいの状況として
    大規模はMySQLを選んだみたいに言ってるようにみえるから。
    244 : NAME IS - 2013/11/19(火) 17:38:27.38 ID:???.net (+107,+29,-38)
    >>242

    ついでにいうとFBやGoogleみたいに中身をぐちゃぐちゃに改造して
    大規模対応って言われてもなぁみたいな。

    中を改変しちまえば、そりゃなんでもできるじゃないという。


    MySQLは大規模に向いているという理由が理解できない。
    245 : NAME IS - 2013/11/19(火) 19:23:08.56 ID:???.net (+4,-27,-2)
    スレッドベースだとなんでLLと相性いいの?
    246 : NAME IS - 2013/11/19(火) 19:24:33.26 ID:???.net (+71,+29,-7)
    >>243
    どこにもそんな古い話ではかかれてないよ
    今の話だよ
    247 : NAME IS - 2013/11/19(火) 19:26:31.32 ID:???.net (+72,+29,-23)
    >>244
    それは作者に聞いてください

    MySQLがPostgreSQLより大規模に向いてるとは僕は思ってない
    248 : NAME IS - 2013/11/19(火) 19:34:05.44 ID:???.net (+35,-29,-22)
    >>245

    RDBMSのコネクションプーリングとかその辺の話 - wyukawa’s blog
    http://d.hatena.ne.jp/wyukawa/20131116/1384621867
    249 : NAME IS - 2013/11/19(火) 19:45:12.17 ID:???.net (+212,+30,-238)
    >>241

    知識は偏ってるね。
    まぁ、元 MySQL のサポートエンジニアでその後は WEB系でしか働いてない人だししゃーないかな。

    >> 俺もそう思う。大規模の定義がFBとGoogle。この2社以外はコスト的にAWSに敵わないみたいに読める。
    >> 実際はそんな簡単じゃないんだけども。
    >> データを自社に置くか置かないをコストだけで判断しない業種がたくさんあるわけだが、
    >> そういう視点がすっぽり抜けてる。

    俺もそう思うが、そういう人は相手にしてない資料なんじゃないかな。
    正直、人事系とか外に出すなんてって思っちゃうけど、
    今後 AWS 使うのは普通になる世の中が来るのかね。

    昔は業務系、今は WEB系で働いてるが、WEB系に関しては、
    よっぽどのことがない限りコストでは AWS の RDS のほうが有利だね。
    細かなチューニングとか、トラブル時の調査とかしにくいけど、
    チューニング出来る人雇うぐらいならスケールアップしたほうが安いっていう。
    250 : NAME IS - 2013/11/19(火) 20:33:40.90 ID:???.net (+108,+29,-65)
    >>248
    一通り見た。
    コネクションプールを使わない場合は
    MySQLのがコネクションを貼るコストがスレッドだから安いから速いってことか

    複数台構成の場合コネクションプール使うし
    1台の場合貼りっぱなしで問題ないから理解が出来なかった
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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