元スレMySQL 総合 Part24
mysql覧 / PC版 /みんなの評価 :
751 = :
じゃあ遠慮無く1テーブルで管理するわ。
データベースの種別とかで調べてたら速度云々で色々と描かれてるのを見て不安になってたんでな。
752 = :
データの入れ物や、データ出し入れする行為を意識しなくてよいのがDBMSのよいところの一つなのに、
それを分割してわざわざプログラム側で入れ物を区別するのも滑稽でしょ。
億・兆オーダーになったら、パーティションを検討してみるのがいいと思う。
753 = :
上記関連事項について質問させてください。
現在、80万レコードで90MBほどのテーブルがあり、一箇月に10万レコードのペースで増えています。
レンタルサーバー(coreserver-mini)のMySQLを利用しているのですが、
どれくらいのレコード数まで順調に動作するものでしょうか?
300万レコードくらいまで快適に動作すればいいと思うのですが、
それまで問題ないでしょうか?よろしくお願いします。
754 = :
問題ないよ
って言われたら信じるの?
サポートに聞きなさい
755 = :
>>754
間違いの無いご回答ありがとうございます。
全くおっしゃる通りです。
ありがとうございました。
756 = :
INSERT INTO `tantousya`(`adress`, `namae_kanji`) VALUE ("Tanaka@", "田中")
WHERE NOT EXISTS ( SELECT * FROM `tantousya` WHERE `tantousya`.`adress` = "Tanaka@");
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064
adressが既に使われている場合に、
データを挿入しないサブクエリを実装したのですが上手くいきません。
INSERT INTO `tantousya`(`adress`, `namae_kanji`) VALUE ("Tanaka@", "田中");
SELECT * FROM `tantousya` WHERE `tantousya`.`adress` = "Tanaka@;
二段階に分けて実行した場合は、まずデータが挿入され、
その後挿入されたデータが表示されます。
エラー内容からサブクエリの書き方に
問題があるように見受けられるのですが、
どこが悪いのか見当もつかない状態です…
757 = :
`adress`か `namae_kanji`で、重複を許さない指定があれば
INSERT IGNORE INTO `tantousya` (`adress`, `namae_kanji`) VALUE ("Tanaka@", "田中");
758 = :
adressが気になるw
759 = :
>>757
プライマリ、ユニークキーを指定というのは至極全うな意見だと思いますが
今回はサブクエリで制御を考えています。
サブクエリの勉強中です。
>>758
adress フランス語で書いちゃったわけではなくタダのスペルミスorz
760 = :
INSERTにNOT EXISTSは直接使えないので、
一旦NOT EXISTSを条件にSELECTし、レコードがない場合に
INSERTすると言うように書かないと無理じゃないかな
761 = :
>>760
なるほど、そういう制限があるんですね。
サブクエリの解説サイト等見直したいと思います。
ありがとうございました。
762 = :
>>761
こんな感じかw
INSERT INTO `tantousya` SELECT 'Tanaka@' AS `adress`, '田中' AS `namae_kanji` FROM DUAL
WHERE NOT EXISTS (SELECT * FROM `tantousya` WHERE `tantousya`.`adress` = 'Tanaka@');
764 = :
↑ 間違えて投稿してしまいました。お詫びいたします
770 = :
http://jobinjapan.jp/job-listing/keyword-mysql.html
771 = :
au氷水ディレクター戦争タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり塩肉マンつばめの巣担々麺野菜炒めラーメン
au氷水ディレクター戦争タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり肉マンつばめの巣塩担々麺野菜炒めラーメン
au氷水ディレクター戦争タイステーキ万国ニューヨークブカ牛肉直輸出制限業者議論病院雇用市議しょうゆダシマクッロスさむらい山雪光金ガンダム風ミックドラ社員あかうんとパズ豚骨のり肉マンつばめの巣塩担々麺野菜炒めラーメン
ニンニクヤーフォー低額土地NHK名古屋遅延電池切れ福岡損保新規駐車近代ゲームフジワイプ転職提案ラーメン
abk公式漏洩安保険王なにあげてんだよ?「わー!ふーう?」↓↓★★↓↓宿題通調印鑑カウントダウン息子議員国会大学生
772 = :
お大事に
つ お薬
774 = :
続き(長々となってすみません)
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
default_character_set=utf8
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
775 = :
ワードプレス?
innodb_buffer_pool_sizeは総メモリの7~8割割り当てろとか言われてる
key_buffer_sizeは64Mぐらいになりそう
sort_buffer_sizeとかが多すぎる
スレッドバッファで調べてみるといい
mysqltuner使ったらだいたい教えてくれる
後エラーログに色々出てるはずだからそれを見る
778 = :
MySQLTunerは5.1で使えるよ
http://mysqltuner.com/
新しいバージョンのほうが当然性能は向上してるし
問題ないなら5.5/6使う方がいいと思う
779 = :
>>778
ありがとうございます
試してみます
780 = :
5.5より5.6
5.7はたいした変更ないけど5.5と5.6はクエリによっては大違いだぞ
781 = :
MySQLで大量のデータ計算させるのに適切なアプリケーションに迷っておりアドバイスあれば教えて下さい。
以前Accessに株価データ入れてVBAで分析みたいなことやってたんですがレコード数が150万ぐらいになるので、MySQL5.6+Access2010に作り直してみたんです。
・ODBC接続してリンクテーブルをAccess内に張り、それに対して操作
・VBAのADOでMySQLテーブルをレコードセットして、それに対して操作
・Accessで計算し、結果をSQL文にしてMySQLに投げる操作
・Accessで計算し、結果をローカルテーブルに書いて最後にテーブルを転送
などやってみたんですが、どれもAccessローカルテーブルに直接操作するよりパフォーマンスが落ちます。
MySQLのクエリ自体は高速なのですがInsert/UpdateをODBC経由やADO接続でやりとりするところがボトルネックみたいで。
PHPとかRubyとかで処理するとそういう問題は少ないのでしょうか。
782 = :
>>781
すくないよ
エンジニアに金はらって作ってもらいな
783 :
結果セットが大量すぎてコピーが遅いならわかるけど
更新処理が遅いのはよくわからんな。
ADOならちゃんとパラメータのバインドとか使えば
そうそう遅くならない
784 = :
>>781
どこにボトルネックがあるのかそれだけじゃ判断つかないし、
まずはマシン構成と、AccessだけのときとMySQLを使ったときで
どのくらい差があるのか、定量的に示すべき。
785 = :
>>782
自分が素人なのは分かってますが、金出すほど複雑なことじゃないしあとで我流の指標とか色々いじりたいのよね・・・
>>783
それはストアドプロシージャ使ってVBAからはCallするだけって感じでしょうか?
>>784
やっていることを単純化すると下記みたいになります。
下記のプログラムでconnectionをMySQLにして1分43秒、 レコードセットOpenするところのcnnを CurrentProject.Connectionに変えてAccess内のテーブルにすると4秒でした。
銘柄コード1301~1999の149,257レコードに対する更新です。
PC一台(i7-3770@3.4GHz, 16GB, Win7 64bit)にAccess2010とMySQL5.6インストールしています。
indexやprimary keyは同じAccess内とMySQL内のt_dbに対するUpdateですが、Conndection変えるだけで20倍以上の差になって驚いています。
t_dbテーブルはある銘柄のある日で特定の1レコードを表し、フィールドは[終値]と[id]と[前日終値]があり、[終値]と[id]は既に入力済み。ここでは[前日終値]を埋めていきたい。
idは銘柄コード4桁+営業日コード5桁で、ソートすると銘柄順、営業日順になります。(同一銘柄-例えば1301だと、130100001,130100002,130100003・・・と営業日順に連番になり、銘柄が変わると数字が飛びます)
idでソートしたt_dbを順番にmovenextしながら、前日のレコードにあった終値を[前日終値]フィールドにUpdateしてます。
Sub test()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim preDayID As Long
Dim preClosePrice As Double
Dim sqlStr As String
cnn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};" & _
"Server=hogehoge;" & _
"Database=hogeDB;" & _
"Uid=hoge;" & _
"Pwd=hage"
strSQL = "SELECT 終値, id, 前日終値 FROM t_db where id between 130100000 and 200000000 order by id"
rst.Open strSQL, cnn, adOpenForwardOnly, adLockPessimistic
Do Until rst.EOF
If rst("id") = preDayID + 1 Then
rst.Update "前日終値", preClosePrice
End If
preDayID = rst("id")
preClosePrice = rst("終値")
rst.MoveNext
Loop
rst.Close
cnn.Close
End Sub
786 = :
ADOでの更新が遅い理由は判らないけど(ODBCの設定、カーソルタイプ、ロックタイプのどれかが影響?)
提示された処理であればSQL一発で大丈夫かと
UPDATE t_db a
INNER JOIN t_db b ON a.id = b.id + 1
SET a.前日終値 = b.終値
WHERE id BETWEEN 130100000 AND 200000000
788 = :
>>785
15万件弱のレコードをMySQLからAccessに取り込んで、1件ずつupdateループ回してるってことか。
更新したいだけならMySQL側だけで完結するように >>786 のやり方が良いと思われ。
789 = :
>>785
ループで毎回updateではなく、抜けたあとでUpdateBatchとかダメだろうか?
http://msdn.microsoft.com/ja-jp/library/cc364237.aspx
790 :
SQL1発で済むならそれが一番だが、無理なら
http://blog.livedoor.jp/it_ikiru/archives/50422207.html
みたいなやり方てバインド使った方がいいよ
レコードセットは内部的にコピー持ってSQL発行してるだけだから
791 = :
ところでコードを貼るならgist使わね?
gistならログイン不要で匿名でスニペット貼り付けられる。
こっちに貼ると行数制限やらタブが消えるやらの問題があるので見づらいし使いづらい。
ちなみに先のコードならこんな感じ。
http://gist.github.com/anonymous/9c2a408bab050f89469d
例示用に勝手に使ってすまぬ >779
792 = :
質問させてください
phpMyAdminで MySQLのデータベースを管理しています。
yumで新しめのphpMyAdminに入れ替えました。
それ以降というもの
20テーブルほど、それぞれ20MB~100MBはあり合計270MBとなっています。
しかし、データベースをまるごとエクスポートすると8MBのサイズになりダウンロード完了と出てしまいます。
なぜでしょうか?
793 = :
775,779の件みなさんありがとうございます。
>>786-782
4秒でした。圧倒的に早いですね。これならAccess単独のVBAループ処理に匹敵できます。
>>789
UpdateBatch1分20秒でした。レコードセットアップデートのループより2,3割早かったです。
非接続にしたレコードセットのループ部分は1秒無いぐらいなのにUpdateBatchでほとんどの時間食ってました。
>>790
パラメーターマーカーの方法も1分20秒でした。
>>791
掲示板でコード示すとき便利そうですね。今後使わせていただきます。
他にも色々やったのですが、ループ毎にUpdate文を文字列で組み立ててcnn.Executeするやり方で1分10秒ほどなのがせいぜいでした。
シーケンシャルにカーソル動かしながら処理していくプログラミングに慣れてたのでSQL一発文組み立てるの苦手だったのですが、これだけ圧倒的パフォーマンスだと使わざるを得ないですね。
なんとかその方向でやってみます。
794 = :
>>792
環境やらバージョンやら、具体的にどういう操作を
したのかやら、書かないと誰もわかんねえよ
797 = :
>>796
あぁそういう手があったか
ありがとうございます
799 = :
mysql 5.6.20
mysqldumpで個々のデータベースのバックアップを取ろうとしているのですが、
mysqldump performance_schema -u root -p > c:/pf.sql
performance_schemaとinformation_schemaで以下のエラーが出ます
mysqldump : Got error: 1142 SELECT, LOCK TABLES command denied to
user 'root'@'localhost' for table 'accounts' when using LOCK TABLES
回避しつつバックアップを取る方法とかってありますか?
ちなみに出来たファイルの中身はコメントだけでした
800 = :
ORACLEにはPL/SQLにPACKAGEがありますが、それに相当する機能ってありますか?
ストアド使わないシステムを作ったこと無いんですが、MySQLはストアド使わなくても速いですか
みんなの評価 :
類似してるかもしれないスレッド
- MySQL 総合 Part25 (947) - [94%] - 2017/6/18 6:30
- MySQL 総合 Part14 (1001) - [94%] - 2008/11/23 10:17 ☆
- MySQL 総合 Part23 (992) - [94%] - 2013/8/11 17:00
- MySQL 総合 Part22 (1001) - [94%] - 2012/7/10 16:45
- MySQL 総合 Part26 (860) - [94%] - 2023/2/2 9:30
- MySQL 総合 Part21 (1001) - [94%] - 2011/12/25 22:16
- MySQL 総合 Part20 (995) - [94%] - 2011/10/17 4:48
- MySQL 総合 Part12 (1001) - [89%] - 2008/1/30 17:34 ○
- MySQL 総合 Part18 (986) - [89%] - 2011/1/17 15:46
- MySQL 総合 Part13 (996) - [89%] - 2008/6/10 21:02 ☆
- MySQL 総合 Part15 (1001) - [89%] - 2009/4/20 12:15 ☆
- MySQL 総合 Part17 (1001) - [89%] - 2010/6/10 20:47 ○
- MySQL 総合 Part19 (982) - [89%] - 2011/6/9 2:33
- MySQL vs PostgreSQL Part2 (941) - [36%] - 2022/5/26 1:30 ○
トップメニューへ / →のくす牧場書庫について