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

私的良スレ書庫

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

元スレMySQL 総合 Part14

mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : - 1 + - mysqldump + - rXBUq5sa + - share + - utf8_bin + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
751 : NAME IS - 2008/10/26(日) 02:03:07 ID:??? (+32,+29,-13)
>>750
何が知りたいんだよ。こんだけ状況説明してんのに。

型指定間違いとか、そんな昨日SQL始めました的な事聞いてるわけじゃないんだけど。
752 : NAME IS - 2008/10/26(日) 08:32:57 ID:??? (+3,+15,-2)
753 : NAME IS - 2008/10/26(日) 08:44:10 ID:??? (+32,+29,-73)
whereつけないorder byだけで抜けたように見えるというなら、それは
本当に入ってないんだろ。それは入れるつもりの値でない別の値を入れて
しまったか、値は正しいがselectの時点では入ってないかのどちらか。
754 : NAME IS - 2008/10/26(日) 10:24:19 ID:??? (-24,-29,-129)
はっきりした。
DATETIMEのORDER BYとLIMITで抜けが出ます。
DATETIME型のカラムをUNIQUEにしてテスト用テーブル作りORDER BYとLIMITでシェルから試してみました。
テーブルに変更は行っておらず、同じクエリを繰り返し、結果は当然同じになるはずですがこれが保証されませんでした。

頻度が低いから気付いてない人がいるかも。

該当Ver MySQL5.0.45
755 : NAME IS - 2008/10/26(日) 21:30:11 ID:gkmt0pAA (-20,-30,-58)
複数IDの更新をしようと思い、

UPDATE SET num=num+1 WHERE id IN('1','2')

としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。

こういう場合、どうやって複数更新したらいいのでしょうか?
やはり、PHPを使ってforで1つずつ更新する方法しかないのでしょうか?
756 : NAME IS - 2008/10/26(日) 21:30:54 ID:??? (+32,+29,-27)
修正

としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。

としているのですが、INの中に指定されているIDが存在すると
更新されるのですが、1つでも存在しないのがあると、更新されません。
757 : NAME IS - 2008/10/27(月) 00:52:04 ID:??? (+43,+29,-62)
当たり前だ。UPDATEっつー命令の意味がわかってんのか、あんたは。
まずは存在しないIDに対してUPDATEを吐くようなヘッポココードを修正しろ。
759 : 755 - 2008/10/27(月) 01:13:27 ID:??? (+37,+29,-69)
>>757
ですよね・・。ただ、1件ずつSELECTで調べてUPDATEとして~
という方法だと、負荷がかかりすぎると思うのです。
処理対象の件数が多ければ多いほど。

何か良い案があればと思い、質問させていただきましたが
SQLだけで無理、もしくは1件ずつ調べる方法しかない場合は諦めます。
760 : 757 - 2008/10/27(月) 01:24:27 ID:??? (-28,-29,-16)
ON DUPLICATE KEY UPDATE ってのもあるけど
761 : NAME IS - 2008/10/27(月) 04:31:58 ID:??? (-23,-30,-96)
InnoDBでwebアプリが動いているのですが、
最近MRTGでCPUが100%になるので、topコマンドで見てみると、

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11728 mysql 25 0 694m 344m 5392 S 11 10.5 26:01.50 mysqld

と、前回restartしてからの時間(26時間)、プロセスが動き続けていることに
なっているのですが、実際ほとんどアクセスはされていません。

mysqldは、このように何十時間もプロセスに出続ける物でしょうか?
接続が終了したら、プロセスの時間はリセットされるのでしょうか?
762 : NAME IS - 2008/10/27(月) 06:27:51 ID:??? (+33,+29,-37)
>>755
意味がわからない。何がしたいのか。
where句で該当しないものがupdateされたら逆に困るだろ。

>>761
当然だろ。プロセスが勝手に終了してどうすんだ。お前はサーバーという意味がわかってない。
763 : NAME IS - 2008/10/27(月) 10:59:19 ID:??? (+27,+25,-14)
>>762
apacheってプロセスの時間短いよね。うちはpreforkだけど。
そういうのを以って言ってるんじゃない?sshdも短いし。
わしその辺詳しくないからわからんわ。
764 : 755 - 2008/10/27(月) 11:00:09 ID:??? (+33,+29,-75)
>>760
いや、追加はしたくないんです。。

>>762
とにかく「複数のレコードのUPDATEを、出来るだけ負荷がかからず行いたい」
と言うのが目的です。確かに存在しないIDが更新されたら困りますが。

更新用のIDリストはログファイルにまとめているので
それの更新をかける時に、削除されているIDがある可能性があるんです。
なので、どのようにしてSQLを組み立てるべきなのか、悩んでいまして・・。
765 : NAME IS - 2008/10/27(月) 11:25:59 ID:??? (+0,-6,-6)
>>764
ほんとにそのSQLで試した?
766 : NAME IS - 2008/10/27(月) 11:45:35 ID:??? (+13,+15,-15)
存在しないid指定しても単に該当するレコードがないからそのidについては
更新されないだけでエラーとかにはならないよな。単に更新件数が減るだけ。
767 : 755 - 2008/10/27(月) 12:25:39 ID:??? (+26,+29,-51)
>>765-766
>>755に書いたソースで試しましたが、全部が更新されないんです。
自分も「単に更新件数が減るだけ」だと思っていたのですが・・。

だから、INを指定する書き方が悪いのかと思い、方法をお尋ねしました。
768 : NAME IS - 2008/10/27(月) 12:33:06 ID:??? (+30,+28,-5)
おかしいね、環境とバージョン書いてみて
769 : NAME IS - 2008/10/27(月) 13:22:30 ID:??? (+24,+29,-8)
>>754
ゼロから詳しくおしえてください
どうやれば再現できますか?
770 : NAME IS - 2008/10/27(月) 14:15:44 ID:??? (-24,-29,-59)
>>767
where ~
~に該当しないのはもちろんupdateされないだろ。
updateしたいレコードをちゃんと抽出できるようにwhereを指定すりゃいいだけだろ。
アホじゃね?
771 : 755 - 2008/10/27(月) 14:48:11 ID:??? (+24,+29,-32)
>>768
バージョンは4.1.22です。

>>770
いやだからそれは759に「こういう事で処理出来ますが~」と書いています。
1件ずつ調べる、対処する方法だと負荷がかかると思うから
「一括で更新する方法はないか?」と言う質問です。
773 : NAME IS - 2008/10/27(月) 15:01:02 ID:??? (+14,+26,-16)
いや、質問者はINの中に存在しないIDがあると、存在するものも含めてすべて更新しないって言ってるんでしょ?
そもそも、そのWHERE区をSELECTで使ったらちゃんと出るの?
775 : NAME IS - 2008/10/27(月) 15:10:06 ID:??? (-15,-30,+0)
少なくとも俺の手元では存在しないid(下の例では2)を指定しても
なんともなかったぞ。

mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL auto_increment,
`value` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> select * from t1;
+----+-------+
| id | value |
+----+-------+
| 1 | 10 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
+----+-------+
4 rows in set (0.00 sec)

mysql> update t1 set value = value+1 where id in(1,2,3);
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2 Changed: 2 Warnings: 0

mysql> select * from t1;
+----+-------+
| id | value |
+----+-------+
| 1 | 11 |
| 3 | 31 |
| 4 | 40 |
| 5 | 50 |
+----+-------+
4 rows in set (0.00 sec)
776 : NAME IS - 2008/10/27(月) 15:12:18 ID:??? (+9,+29,-22)
質問者がテーブル構造もろくに書いてないのが問題だが、
いくらなんでも、>>774の様に仮定する人はいないと思うが。
まあエスパーか同じようなテーブル書く人なのかもしれんが。
778 : NAME IS - 2008/10/27(月) 15:24:58 ID:l/LuSqsB (-18,+29,-58)
なんでもいいが、>>773の言うように、selectできりゃupdateできる。
ようは抽出が出来てないだけだ。

つか、掲示板で聞く前に、本でも買って少しぐらい勉強しろ。呆
779 : 755 - 2008/10/27(月) 15:52:41 ID:??? (+30,+30,-101)
自分の書き方が悪いのか、全く伝わっていませんね・・。
もちろん、自分で調べてググってそれでも解決しないから
皆さんの知恵をいただこうと思い、質問しました。

もちろん、SELECTでも出力されるし、テーブル構造も>>775のような形です。
だから、「SELECTしてUPDATEするの繰り返すと負荷がかかる」
という意見が言えるのではないでしょうか。

どのように質問すれば皆さんに理解して貰える書き方が出来るか
馬鹿な私にはわかりませんので、もう遠慮します。色々ありがとうございました。
780 : NAME IS - 2008/10/27(月) 16:00:29 ID:??? (+37,+29,-24)
>>779
だから全く問題ないのに、結果がおかしいんだろ。
異常が出てるのはそこだけじゃないかもしれないから、
1件ずつ入れて回避するようなことをせずに、根本的に直したほうがいいよ。
インストールしなおしたら?
781 : NAME IS - 2008/10/27(月) 16:02:42 ID:??? (+30,+29,-40)
結局、>>775のような、とは書いてるが実際のテーブルとかそこで使用したSQLとか
結果とか全然あげてないじゃん。あとで自分のミスに気がついて赤面することになるとは思うけど
問題解決したいなら全部さらしたほうがいいと思うよ。
782 : NAME IS - 2008/10/27(月) 16:04:27 ID:l/LuSqsB (-9,+30,-90)
>>779
君は本買って勉強したほうがいい。ど素人中のど素人だから、今の段階で質問をするべきじゃない。
一回で抽出できりゃ、一回でupdateできるって言ってるだろ。意味がわからないんだから、そうとう知識がないんだよ。

>>780
お前もひどいアドバイスだな。無駄な事させてやるな。
783 : NAME IS - 2008/10/27(月) 17:05:10 ID:??? (+32,+29,-64)
SQL直書きでは上手く動いているけどPHPとかのスクリプトでSQL生成した時に
失敗している気がするな

後からログ拾ってバッチするよりその時一緒に処理するのが一番なんだけどね
例外起きた時にもROLLBACKで整合性を保てるし
784 : NAME IS - 2008/10/27(月) 17:47:32 ID:??? (-27,-30,-21)
>>779
UPDATE SET num=num+1 WHERE id = '1' OR id = '2'
じゃダメなんだっけ?
788 : NAME IS - 2008/10/27(月) 23:36:23 ID:??? (-19,-30,-142)
5.0.27で、InnoDBのINSERTとDELETE間でロックが発生するんですが、これって仕様なんでしょうか?
それらしい記述は見つけられなかったのですが。

端末A
create table x ( id int ) type=InnoDB;
insert into x values (1);
COMMIT;
START TRANSACTION;
insert into x values (2);

端末B
delete from x where id=1;
->待ち発生。端末AでCOMMITすると実行される。
790 : NAME IS - 2008/10/28(火) 02:38:34 ID:??? (-26,-30,-87)
>>788
これでやってみなー

端末A
create table x ( id int ) type=InnoDB;
create index x_id on x (id);
insert into x values (1);
COMMIT;
START TRANSACTION;
insert into x values (2);

端末B
delete from x where id=1;
792 : NAME IS - 2008/10/28(火) 08:32:29 ID:??? (-29,-30,-39)
>>755
話題に乗り遅れた亀だけど。
SELECT * FROM hoge_table where pid not in (1, null);
not inを作るときに右辺にnull値が入ってたんじゃね?とかっていうエスパー回答。

postgresqlのマニュアルっぽいけど。
右辺にNULL値が存在したらIN述語がうまくうごかない
http://www.l2tp.org/2008/01/nullin.html
794 : NAME IS - 2008/10/28(火) 09:21:55 ID:??? (-26,-29,-7)
桁数を指定したいならDECIMALやNUMERIC使え。
798 : NAME IS - 2008/10/28(火) 13:22:26 ID:??? (-19,-30,-165)
InnoDBなのですが、order byに時間がかかってしまいます。

select * from table where mid='hoge' order by id desc limit 0,10;

explainで確認したところ、 Using filesortとなっていてorder byにはindexが使われていないようです。
order byの対象レコードはrows 41074(mid='hoge'が41074レコード)なのですが、

これで一秒ほどもかかってしまいます。
midとidにそれぞれindexを作成しています。
何か良い改善策はありますでしょうか?
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : - 1 + - mysqldump + - rXBUq5sa + - share + - utf8_bin + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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