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

みんなの評価 : ☆
レスフィルター : (試験中)
http://dev.mysql.com/doc/ 落ちてる ?
whereつけないorder byだけで抜けたように見えるというなら、それは
本当に入ってないんだろ。それは入れるつもりの値でない別の値を入れて
しまったか、値は正しいがselectの時点では入ってないかのどちらか。
本当に入ってないんだろ。それは入れるつもりの値でない別の値を入れて
しまったか、値は正しいがselectの時点では入ってないかのどちらか。
はっきりした。
DATETIMEのORDER BYとLIMITで抜けが出ます。
DATETIME型のカラムをUNIQUEにしてテスト用テーブル作りORDER BYとLIMITでシェルから試してみました。
テーブルに変更は行っておらず、同じクエリを繰り返し、結果は当然同じになるはずですがこれが保証されませんでした。
頻度が低いから気付いてない人がいるかも。
該当Ver MySQL5.0.45
DATETIMEのORDER BYとLIMITで抜けが出ます。
DATETIME型のカラムをUNIQUEにしてテスト用テーブル作りORDER BYとLIMITでシェルから試してみました。
テーブルに変更は行っておらず、同じクエリを繰り返し、結果は当然同じになるはずですがこれが保証されませんでした。
頻度が低いから気付いてない人がいるかも。
該当Ver MySQL5.0.45
複数IDの更新をしようと思い、
UPDATE SET num=num+1 WHERE id IN('1','2')
としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。
こういう場合、どうやって複数更新したらいいのでしょうか?
やはり、PHPを使ってforで1つずつ更新する方法しかないのでしょうか?
UPDATE SET num=num+1 WHERE id IN('1','2')
としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。
こういう場合、どうやって複数更新したらいいのでしょうか?
やはり、PHPを使ってforで1つずつ更新する方法しかないのでしょうか?
修正
としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。
↓
としているのですが、INの中に指定されているIDが存在すると
更新されるのですが、1つでも存在しないのがあると、更新されません。
としているのですが、INの中に指定されているIDが存在すると
更新されないのですが、1つでも存在しないのがあると、更新されません。
↓
としているのですが、INの中に指定されているIDが存在すると
更新されるのですが、1つでも存在しないのがあると、更新されません。
当たり前だ。UPDATEっつー命令の意味がわかってんのか、あんたは。
まずは存在しないIDに対してUPDATEを吐くようなヘッポココードを修正しろ。
まずは存在しないIDに対してUPDATEを吐くようなヘッポココードを修正しろ。
>>757
ですよね・・。ただ、1件ずつSELECTで調べてUPDATEとして~
という方法だと、負荷がかかりすぎると思うのです。
処理対象の件数が多ければ多いほど。
何か良い案があればと思い、質問させていただきましたが
SQLだけで無理、もしくは1件ずつ調べる方法しかない場合は諦めます。
ですよね・・。ただ、1件ずつSELECTで調べてUPDATEとして~
という方法だと、負荷がかかりすぎると思うのです。
処理対象の件数が多ければ多いほど。
何か良い案があればと思い、質問させていただきましたが
SQLだけで無理、もしくは1件ずつ調べる方法しかない場合は諦めます。
ON DUPLICATE KEY UPDATE ってのもあるけど
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は、このように何十時間もプロセスに出続ける物でしょうか?
接続が終了したら、プロセスの時間はリセットされるのでしょうか?
最近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は、このように何十時間もプロセスに出続ける物でしょうか?
接続が終了したら、プロセスの時間はリセットされるのでしょうか?
>>764
ほんとにそのSQLで試した?
ほんとにそのSQLで試した?
存在しないid指定しても単に該当するレコードがないからそのidについては
更新されないだけでエラーとかにはならないよな。単に更新件数が減るだけ。
更新されないだけでエラーとかにはならないよな。単に更新件数が減るだけ。
いや、質問者はINの中に存在しないIDがあると、存在するものも含めてすべて更新しないって言ってるんでしょ?
そもそも、そのWHERE区をSELECTで使ったらちゃんと出るの?
そもそも、そのWHERE区をSELECTで使ったらちゃんと出るの?
少なくとも俺の手元では存在しない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)
なんともなかったぞ。
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)
自分の書き方が悪いのか、全く伝わっていませんね・・。
もちろん、自分で調べてググってそれでも解決しないから
皆さんの知恵をいただこうと思い、質問しました。
もちろん、SELECTでも出力されるし、テーブル構造も>>775のような形です。
だから、「SELECTしてUPDATEするの繰り返すと負荷がかかる」
という意見が言えるのではないでしょうか。
どのように質問すれば皆さんに理解して貰える書き方が出来るか
馬鹿な私にはわかりませんので、もう遠慮します。色々ありがとうございました。
もちろん、自分で調べてググってそれでも解決しないから
皆さんの知恵をいただこうと思い、質問しました。
もちろん、SELECTでも出力されるし、テーブル構造も>>775のような形です。
だから、「SELECTしてUPDATEするの繰り返すと負荷がかかる」
という意見が言えるのではないでしょうか。
どのように質問すれば皆さんに理解して貰える書き方が出来るか
馬鹿な私にはわかりませんので、もう遠慮します。色々ありがとうございました。
>>779
だから全く問題ないのに、結果がおかしいんだろ。
異常が出てるのはそこだけじゃないかもしれないから、
1件ずつ入れて回避するようなことをせずに、根本的に直したほうがいいよ。
インストールしなおしたら?
だから全く問題ないのに、結果がおかしいんだろ。
異常が出てるのはそこだけじゃないかもしれないから、
1件ずつ入れて回避するようなことをせずに、根本的に直したほうがいいよ。
インストールしなおしたら?
結局、>>775のような、とは書いてるが実際のテーブルとかそこで使用したSQLとか
結果とか全然あげてないじゃん。あとで自分のミスに気がついて赤面することになるとは思うけど
問題解決したいなら全部さらしたほうがいいと思うよ。
結果とか全然あげてないじゃん。あとで自分のミスに気がついて赤面することになるとは思うけど
問題解決したいなら全部さらしたほうがいいと思うよ。
SQL直書きでは上手く動いているけどPHPとかのスクリプトでSQL生成した時に
失敗している気がするな
後からログ拾ってバッチするよりその時一緒に処理するのが一番なんだけどね
例外起きた時にもROLLBACKで整合性を保てるし
失敗している気がするな
後からログ拾ってバッチするよりその時一緒に処理するのが一番なんだけどね
例外起きた時にもROLLBACKで整合性を保てるし
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すると実行される。
それらしい記述は見つけられなかったのですが。
端末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すると実行される。
>>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;
これでやってみなー
端末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;
>>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
話題に乗り遅れた亀だけど。
SELECT * FROM hoge_table where pid not in (1, null);
not inを作るときに右辺にnull値が入ってたんじゃね?とかっていうエスパー回答。
postgresqlのマニュアルっぽいけど。
右辺にNULL値が存在したらIN述語がうまくうごかない
http://www.l2tp.org/2008/01/nullin.html
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を作成しています。
何か良い改善策はありますでしょうか?
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を作成しています。
何か良い改善策はありますでしょうか?



類似してるかもしれないスレッド
- MySQL 総合 Part12 (1001) - [94%] - 2008/1/30 17:34 ○
- MySQL 総合 Part13 (996) - [94%] - 2008/6/10 21:02 ☆
- MySQL 総合 Part24 (1010) - [94%] - 2015/2/14 4:46
- MySQL 総合 Part15 (1001) - [94%] - 2009/4/20 12:15 ☆
- MySQL 総合 Part17 (1001) - [94%] - 2010/6/10 20:47 ○
- MySQL 総合 Part18 (986) - [94%] - 2011/1/17 15:46
- MySQL 総合 Part19 (982) - [94%] - 2011/6/9 2:33
- MySQL 総合 Part26 (860) - [89%] - 2023/2/2 9:30
- MySQL 総合 Part20 (995) - [89%] - 2011/10/17 4:48
- MySQL 総合 Part21 (1001) - [89%] - 2011/12/25 22:16
- MySQL 総合 Part22 (1001) - [89%] - 2012/7/10 16:45
- MySQL 総合 Part23 (992) - [89%] - 2013/8/11 17:00
- MySQL 総合 Part25 (947) - [89%] - 2017/6/18 6:30
- MySQL vs PostgreSQL Part2 (941) - [31%] - 2022/5/26 1:30 ○
トップメニューへ / →のくす牧場書庫について