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

私的良スレ書庫

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

元スレMySQL 総合 Part19

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
102 : NAME IS - 2011/02/16(水) 01:32:03 ID:??? (+3,-29,-50)
キャッシュ
適切なインデックスを張る
memcached / KVS
メモリにデータが乗るかどうか(乗り切れないとHDDへの物理アクセス発生して劇遅)

などで調べてみると少し入り口が見えるかもしれません
103 : 6 - 2011/02/16(水) 09:50:30 ID:XM7AGT4t (+37,+29,-54)
カラム数が80個ほどでレコード数が1000万件くらいのテーブルが
40個あります。
40個のテーブルには随時更新がかかる状態なんですが、
この40個のテーブルのある瞬間のデータを取得したい時って
どうすればよいですか?
データを取得するときには更新とかを行わせたくないのですが、
ロックするしか無いのでしょうか?
104 : NAME IS - 2011/02/16(水) 09:56:58 ID:??? (+57,+30,-129)
>>101
データ件数によるパフォーマンスの劣化を気にするなら、30万件なり1200万件なり用意して
テストしてみるのが一番だと思う。

技術的にどうしているって訊かれても、実際に近いデータを用意して色々試して、EXPLAIN
でその違いを調べる、の繰り返しかな。
本とかに書いてある知識は、その調査のための手がかりかきっかけみたいなもので、そのもの
ずばりとノウハウにはあまりなってない。少なくとも自分はそう思っている。
106 : NAME IS - 2011/02/16(水) 11:06:28 ID:??? (-1,-29,-17)
intはいつから10進数になったの?
107 : NAME IS - 2011/02/16(水) 13:21:06 ID:??? (-1,-29,-30)
phpがmysqlにデータ書き込みしてる最中に
pythonのプログラムも同じテーブルに重複して書き込みするとどうなるの?
108 : NAME IS - 2011/02/16(水) 13:57:39 ID:??? (+57,+29,-41)
プログラムの巧拙とテーブル設計の巧拙による・・・としか言いようがないな。
109 : NAME IS - 2011/02/16(水) 14:04:33 ID:??? (+7,-20,-13)
mysqlの排他制御を自動でしてくれるのはphpぐらい?
110 : NAME IS - 2011/02/16(水) 16:28:50 ID:??? (+57,+29,-4)
いやトランザクションなやInnodbがやってくれるじゃん
112 : NAME IS - 2011/02/17(木) 16:00:29 ID:??? (+17,-29,-5)
ALTER TABLE tbl AUTO_INCREMENT = 10000;
113 : NAME IS - 2011/02/17(木) 16:42:45 ID:CUZWRZbZ (-5,+29,-68)
不要なテーブルtbを削除しようとしたところ、外部キーの関係と思われるエラーで削除できません。
制約やインデクスの削除もできないため、試しに関連のfrmファイル等を直接削除(移動)してみました。
動作上は現在のところ何ごともないようなのですが、
別に管理データが残ったりなど、何か問題起こりうるものでしょうか。
115 : NAME IS - 2011/02/17(木) 19:27:42 ID:??? (+31,+5,+3)
>>112
ありがとうございました
116 : NAME IS - 2011/02/17(木) 22:12:38 ID:??? (+57,+29,-4)
FROMがFORMになって全然気づかなくて困ったことあるヤツ挙手
117 : NAME IS - 2011/02/17(木) 22:38:15 ID:??? (+3,-24,-7)
mysqlは

fromキーワードが指定の位置にありません

って言われないのか
118 : NAME IS - 2011/02/18(金) 00:42:13 ID:??? (+13,-17,-34)
接続時間・負荷テストをしたいんですが、
みなさん数万件レベルのデータってどのように取得しているんでしょうか?

MySQL データ 数万件 サンプルあたりで調べてもヒットせず…
119 : NAME IS - 2011/02/18(金) 01:07:58 ID:??? (-2,-26,-9)
>>118
つ wikipedia
120 : NAME IS - 2011/02/18(金) 01:11:53 ID:??? (+2,-25,-19)
趣旨がよく分からん
プログラムでランダムに文字列作ってinsertするんじゃ駄目なのか?
数万行のinsertなら数秒で終わるだろ
121 : NAME IS - 2011/02/18(金) 01:32:19 ID:??? (+57,+29,-26)
適当に数十件程度の元データを作って、select,insertを繰り返していけば
倍々に増えていくから何件だろうが
作業自体は簡単。
123 : NAME IS - 2011/02/18(金) 23:57:07 ID:nVNzwfTM (+0,-30,-214)
MySQL5+PHP5で勉強している初心者です。
現在、架空の倉庫を想定して勉強しているのですが、
UNIONした後にJOINするとこでつまずいています。
phpで実行する前にphpmyadmin上でテストしているのですが…

<商品リストテーブル>
商品ナンバー,商品名
<在庫テーブル>
商品ナンバー,ロットナンバー,在庫数
<出庫テーブル>
商品ナンバー,ロットナンバー,出庫数

上記のような3つのテーブルを用意しています。
まず、商品ナンバー毎の総合計数(在庫合計-出庫数)を出したかったので

SELECT 商品ナンバー,SUM(在庫数) as 在庫合計 FROM (
SELECT 商品ナンバー,在庫数 FROM 在庫テーブル
UNION
SELECT 商品ナンバー,-(出庫数) as 在庫数 FROM 出庫テーブル
) as test group by 商品ナンバー

で出庫データを反映させた現在庫数が表示されるところまで出来ました。
で、最終目的としては
商品ナンバー,商品名,在庫合計
と表示させたいので
商品リストテーブルをJOINしたいのですがなかなかうまくいきません。
どうすれば最終目的に辿りつけるのでしょうか?
ご教示お願い致します。
124 : NAME IS - 2011/02/19(土) 00:55:58 ID:??? (+57,+29,-20)
> 商品リストテーブルをJOINしたいのですがなかなかうまくいきません。

どのようにうまく行かないのですか?
どんなSQLを書いてみたかもわからないから応え難いです
125 : 123 - 2011/02/20(日) 01:44:29.68 ID:??? (-4,-30,-148)
言葉足らずで申し訳ありませんでした
>>123から試行錯誤した結果、
SELECT * FROM 商品リストテーブル RIGHT JOIN(
SELECT 商品ナンバー,SUM(在庫数) as 在庫合計 FROM (
SELECT 商品ナンバー,在庫数 FROM 在庫テーブル
UNION
SELECT 商品ナンバー,-(出庫数) as 在庫数 FROM 出庫テーブル
) u1 group by 商品ナンバー) as test ON 商品リストテーブル.商品ナンバー=test.商品ナンバー

上記で一応は期待する結果が得られましたが、
これでいいものなのでしょうか?
126 : NAME IS - 2011/02/20(日) 02:42:20.03 ID:??? (+0,+0,+0)
>>123
「マイナス出庫数」を並べてSUMを取るって筋悪じゃね

mysql> SELECT * FROM item;
+---------+-----------+
| item_no | item_name |
+---------+-----------+
|    1 | apple   |
|    2 | orange  |
+---------+-----------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM stock;
+---------+--------+-----------+
| item_no | lot_no | stock_qty |
+---------+--------+-----------+
|    1 |   1 |    100 |
|    1 |   2 |    50 |
|    2 |   1 |    80 |
|    2 |   2 |    40 |
+---------+--------+-----------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM delivery;
+---------+--------+--------------+
| item_no | lot_no | delivery_qty |
+---------+--------+--------------+
|    1 |   1 |      15 |
|    1 |   2 |      25 |
|    2 |   1 |      35 |
|    2 |   2 |      45 |
+---------+--------+--------------+
4 rows in set (0.00 sec)

SELECT i.item_no, i.item_name, s.s_q - d.d_q total FROM item i,
(SELECT item_no, SUM(stock_qty) AS s_q FROM stock group by item_no) s,
(SELECT item_no, SUM(delivery_qty) AS d_q FROM delivery group by item_no) d
WHERE i.item_no = s.item_no
AND s.item_no = d.item_no
;

+---------+-----------+-------+
| item_no | item_name | total |
+---------+-----------+-------+
|    1 | apple   |  110 |
|    2 | orange  |  40 |
+---------+-----------+-------+
2 rows in set (0.00 sec)

こんな感じ
127 : NAME IS - 2011/02/20(日) 14:42:59.29 ID:??? (+52,-30,+0)
どなたか以下の問題エスパーしていただけないでしょうか。

InnoDBでINNER/LEFT OUTER JOINを30くらい(大半はINNER JOIN。ネストしてるものも有り。)つないでるSELECTが
もっさりしてます。

EXPLAINで確認しましたがtypeは全てeq_refでした。
profilingで見てみるとstaticticsという部分が99%以上時間を占めているのですが
パラメータ設定などで見直すべきところはどこでしょうか…?

innodb_buffer_pool_sizeをデフォルト値から増加させたところ若干は改善しましたが、本当に若干でした。
join_buffer_sizeなど、説明を読む限り今回関係なさそうなパラメータも増やしてみたりしましたが、案の定意味が無いようでした。


また、上のクエリにさらにLEFT OUTER JOINを1つ(typeはref)を加えると
応答しなくなりました…

1つのテーブルにはそれぞれ数件程度しか登録しておらず、SELECTの結果も10件未満になるようなデータでテストしています。
試しにOracle XEで同じデータに同様のSELECTを投げてみると瞬殺でした。
MySQLのバージョンは5.1/5.5で試しましたがいずれも同じ結果でした。
128 : NAME IS - 2011/02/20(日) 20:15:00.19 ID:??? (+60,+27,-13)
>>127
30クエリバラバラにしたほうが早そうだな。
129 : NAME IS - 2011/02/20(日) 21:09:43.08 ID:??? (+87,-5,-15)
1つのテーブル内にあるフィールド2つをまとめて
ひとつユニークキーみたい(重複不可能)に
したいのですが、どうやるのでしょうか?
MyISAMです。
130 : NAME IS - 2011/02/20(日) 22:25:58.89 ID:??? (+54,+30,+0)
131 : NAME IS - 2011/02/21(月) 08:08:01.12 ID:??? (+48,-29,-74)
>>127
MySQLでテーブル二桁JOINする時点でたぶんダメ。
Oracleと同じJOIN順になるようにFROM句並べ替えてSTRAIGHT_JOINつけてみて、
改善されないようならOracle買うかPostgreSQLで。
133 : NAME IS - 2011/02/24(木) 00:10:29.12 ID:??? (+19,-29,-21)
>>132

mysql -u root -pパスワード < dump.sql

だったらどうなる?
134 : NAME IS - 2011/02/24(木) 04:52:33.89 ID:??? (+54,+29,+2)
>>133
ありがとございます
135 : NAME IS - 2011/02/24(木) 15:00:28.34 ID:??? (+69,+29,-53)
「MySQLは1つのクエリーで1つのテーブルに対し、1つのインデックスしか機能しない」

というのを見かけたのですが
これって5.1でもそうなのでしょうか?

1つのテーブルに複数のインデックスをつけても意味が無いというわけ?
136 : NAME IS - 2011/02/24(木) 23:38:36.59 ID:??? (+12,-29,-46)
>>135
INDEX MERGEは前からあるので「1つのインデックスしか~」は嘘。
http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

ただ個人的にINDEX MERGEで速くなった経験はないな。OracleでもMySQLでも。
手抜きしないで複合INDEX作った方がいい。
137 : 127 - 2011/02/25(金) 00:19:10.67 ID:??? (+73,+29,-84)
>>129>>131
クエリをバラすと、テストデータ程度の件数に置いては他のDBMSと遜色ないレベルに
なることがわかりました。

が、データ量が増えた際の不安が残っておりますので、他のプロダクトへの
乗り換えも含めて検討したいと考えています。

ありがとうございました。
139 : NAME IS - 2011/02/25(金) 19:05:47.75 ID:??? (+19,-29,-59)
Aテーブルに、
c1, c2, c3, c4, c5, c6
という6個のカラムがあり、
このうち3個以上がnullでない行を取り出したいのですが、
SQLでどう表現すればいいのか分かりません。
分かる方がいましたら教えてください。お願い致します。
140 : NAME IS - 2011/02/25(金) 19:51:46.84 ID:??? (-1,-29,-15)
>>138
CentOSならRHEL用のRPMを使えばいいのでは
141 : NAME IS - 2011/02/25(金) 19:59:10.48 ID:??? (+72,-30,-57)
>>139
WHERE IF(c1 IS NOT NULL, 1, 0)
+ IF(c2 IS NOT NULL, 1, 0)
+ IF(c3 IS NOT NULL, 1, 0)
+ IF(c4 IS NOT NULL, 1, 0)
+ IF(c5 IS NOT NULL, 1, 0)
+ IF(c6 IS NOT NULL, 1, 0) >= 3
142 : NAME IS - 2011/02/25(金) 23:46:16.51 ID:??? (+54,+26,+1)
>>141
頭いいな
143 : NAME IS - 2011/02/26(土) 01:44:39.24 ID:??? (+52,+29,-1)
へーこんな書くんかー
144 : 140 - 2011/02/26(土) 02:10:28.43 ID:??? (+67,+29,-33)
>>141
ありがとうございました!
無事期待通りの動作を実現できました。
JOINとかサブクエリとかごちゃごちゃ使わないと無理だと思っていたので目から鱗でした。
145 : 139 - 2011/02/26(土) 02:11:04.37 ID:??? (+42,+19,+2)
すいません名前間違えました。
146 : NAME IS - 2011/02/26(土) 14:32:00.34 ID:??? (+7,-29,-25)
>>141
Excel VBAだなw
147 : NAME IS - 2011/02/26(土) 20:51:10.32 ID:+NrYsy5E (+11,+11,-35)
>>103
InnoDBなら、トランザクション分離レベルを適切に設定してあげればできそう。
148 : NAME IS - 2011/02/27(日) 00:47:46.93 ID:??? (+3,-30,+0)
現場で使えるSQLという本のP221の
「商品IDを引数で指定し、その卸単価を商品マスタから取得するストアドプロシージャを作成せよ
ただし、卸単価は引数に格納し、該当商品が無い場合は卸単価に-1、その他のエラーの場合は-2を格納せよ」
という問題にて、色々と試しまくって、結局
DROP PROCEDURE SP;
DELIMITER $$
CREATE PROCEDURE SP ( IN id int, OUT price int )
BEGIN
DECLARE CONTINUE HANDLER FOR SQLWARNING SET price = -2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET price = -1;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET price = -2;
SELECT 卸単価 INTO price
FROM 商品マスタ
WHERE 商品ID = id;
END $$
DELIMITER ;
CALL SP(15, @price);
SELECT @price;
とし-1が表示されました。
しかし、CALL SP(a, @price); 等とすると、-2と表示されるのかと思ったら、普通にエラーが出ました。
自分のSQL文がどこが間違っているのかご指摘願えませんか?
そもそも、-2を出力するような、その他の例外と言うのがどういう状況の事を言っているのか分かりません。
149 : NAME IS - 2011/02/27(日) 11:09:21.45 ID:??? (+99,+10,-48)
既存のテーブルのcreate文を確認する方法ってありますか?
ご存知でしたら教えていただきたいです。
150 : NAME IS - 2011/02/27(日) 11:21:54.63 ID:??? (+92,+22,-15)
>>149 バックアップの中身を見たことあるか?
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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