MySQL 総合 Part10 at DB
[2ch|▼Menu]
906:NAME IS NULL
07/04/24 07:14:21
>>905
具体性のない聞き方をされてもやり方が悪いのだろうとしかいえないが、いくつか例を挙げると。
単純なケースで索引が使われないとすると、
検索するフィールドに関数を使っている。または中間一致検索を行っている。
 where substr(COL1, 1, 5) = 'ABCDE' だと索引は使われない
 where COL1 like 'ABCDE%' だと使用される。
 where COL1 like '%ABCDE%' だと使用されない。
複合キーの索引で二番目のキーだけで検索しようとしている。
JOINをあれこれ使ってるならその結合の方法が悪い。
SQLにアホなヒントが含まれている。

907:NAME IS NULL
07/04/24 10:00:38
>>905
インデックスの使われ方については、>>906の様な規則性が
マニュアルで分かりやすく解説されてる。

実際のインデックス使用状況の調査は EXPLAIN SELECT。

908:NAME IS NULL
07/04/24 11:41:27
2分木を自分で作ってみりゃわかる


909:NAME IS NULL
07/04/24 23:03:17 LAPZ3XJh
すみません、ちょっとお伺いしてもよろしいでしょうか?
MySQL 4.1.20+Perl5.xで、Limit句にプレースホルダを使おうとすると
「You have an error in your SQL syntax」と怒られてしまいます。
これってMySQLの仕様なのでしょうか?

910:NAME IS NULL
07/04/24 23:32:24
>>909
少なくともうちでは問題がない。
DBI->VERSION は 1.53
DBD::mysql->VERSION は 4.001

1. 実際に書いたSQL文
2. DBIおよびDBD::mysqlのバージョン

を書きな。


911:NAME IS NULL
07/04/25 00:28:15 bO4ZwTXJ
>>910
レスありがとうございます。
実際に書いたSQL文は以下の通りです。

-------------------------------------------------------

$sth = $dbh->prepare(q{

SELECT id
FROM table
WHERE (

alrt_cond = 0 and
? LIKE CONCAT('%', keyword1, '%') or
? LIKE CONCAT('%', keyword2, '%')

)or(

alrt_cond = 1 and
? LIKE CONCAT('%', keyword1, '%') and
? LIKE CONCAT('%', keyword2, '%')

)

LIMIT ?,?

}) or die $DBI::errstr;

-------------------------------------------------------

上記SQL文は「LIMIT 0,10」などと数値を決め打ちすると、
正常に動作します。バージョンですが、

DBI     -> v1.40
DBD::mysql -> v2.9004

となっていました。
モジュールのバージョンのせいでしょうか?

912:NAME IS NULL
07/04/25 08:21:32
パフォーマンス出そうにないSQLだなぁ。。。

DBD::mysqlのチェンジログ読みな
URLリンク(search.cpan.org)

913:NAME IS NULL
07/04/25 10:08:07
>>911
そういえば、数年前に Limitにプレースホルダ付けられなくて
諦めた様な記憶が…。

にしても、 OR と LIKE の固まりで、確かにこれ遅くないですか?
おれが報酬8千円でテーブル構造含めて直してたげるよw

914:NAME IS NULL
07/04/25 20:00:10 o6tXk+iA
mysql5.0.30,Innodb使ってます

start transaction;
call kansuu;
commit;

とやると2秒

call kansuu;

とやると数時間

この差はどうしてでしょうか

915:NAME IS NULL
07/04/25 20:47:06
>>914
その「kansuu」というストアドプロシージャの中身を
見せてくれなければ評価のしようがないんだが・・・
大方ループの中でinsertやらupdateしてるんだろうけどさ

916:NAME IS NULL
07/04/26 00:54:46
そうです
1万行
ループの中でinsertやらupdateしてるだけです>kansuu

917:NAME IS NULL
07/04/26 04:02:39
まとめてコミットするか、毎回するかの違いでねーの。

918:NAME IS NULL
07/04/26 08:31:26 3AkY0mPI
なるほど、しかし、数時間も変わるのはすごいですね
こんなにはやいならトランザクション利用して処理した方がいいですね

919:NAME IS NULL
07/04/26 08:48:16
その分、メモリ食ってたりしないか?

920:NAME IS NULL
07/04/26 12:23:16 3AkY0mPI
私もきになってました
1gだときついけど100mなら何とか行けそうです。
どれくらいなんでしょうかね

921:NAME IS NULL
07/04/26 13:14:06
MyISAMでも大量のデータをまとめてinsert、update、load data するなら
最後にまとめてインデックスを構築させると圧倒的に早いケースがある。
もちろん既存データの状況にもよるが。

ALTER TABLE hoge DISABLE KEYS;

LOAD DATA or 大量 insert,update

ALTER TABLE hoge ENABLE KEYS;


922:NAME IS NULL
07/04/26 17:45:58 uFYJq2Vn
>>895さんの書き込みを見て思ったのですが、
SELECTした結果だけではなく、一緒に定数もINSERT
することはできるのでしょうか?

insert into テーブルA select * from テーブルB [where 条件]

だと、テーブルAにはSELECTの結果(のみ)が挿入されますが、
テーブルAのフィールドが2つあったとき、例えば「5」
などの数値とSELECTの結果の一部を挿入できたら、と考えています。

insert into テーブルA (5,select id from テーブルB [where 条件])

みたいな・・・。こんなことって可能でしょうか?

923:NAME IS NULL
07/04/26 18:26:14 uFYJq2Vn
922です。自己レスです。

insert into テーブルA
values(5,(
 select id from テーブルB [where 条件]
))

と、サブクエリを括弧で囲うだけで簡単にできました♪
お騒がせいたしました。

924:NAME IS NULL
07/04/27 01:02:54
php でのプログラミング経験はあるんですが、SQL は使ったことの無い初心者です。

php + MySQL で 複数板・マルチスレッドな掲示板を作ろうと思っています。
規模は 1日に1000記事投稿程度で、データは全部 SQL に入れる感じにする予定です。

・板A, 板B, 板C …
・スレッドA, スレッドB, スレッドC …
・レスA, レスB, レスC

って感じに、板にスレッドがぶら下がり、それにレスがぶら下がるという2chのような形式です。

その場合には、

○テーブル1 … 板情報
* 板番号
* 板名称

○テーブル2 … スレッド情報
* 板番号 (どの板に属するスレッドだかを調べる為)
* スレッド番号
* スレッドタイトル

○テーブル3 ・・・レス情報
* 板番号 (どの板に属するレスだかを調べる為)
* スレッド番号 (どのスレッドに属するレスだかを調べる為)
* レス番号
* 投稿日時
* 名前
* 本文

のように、3つのテーブルに全データをいれる感じで問題無いでしょうか?

これだと、スレッド一覧にスレッド作成者の名前を表示する場合には、(一度に100スレッド表示されると)
ページにアクセスしただけで、100個のテーブルが呼び出されることになりますが、MySQL のようなデータベースだと
その負荷は無視できる範囲なのでしょうか?

ご教示いただけたら幸いです。

925:924
07/04/27 01:07:53
すみません、訂正です。

(誤) ページにアクセスしただけで、100個のテーブルが呼び出されることになりますが
(正) スレッド一覧ページに1回アクセスしただけで、テーブル1とテーブル2 それぞれ1回ずつに加え、テーブル3 が 100回呼び出されることになりますが

呼び出し方は、

(1) テーブル2 から1行持ってくる
(2) それをもとに テーブル3 を開き、スレッド作成者の名前を入手
(3) テーブル2 から次の1行を持ってくる
(4) それをもとにテーブル3を開き、スレッド作成者の名前を入手
 ・
 ・
 ・
(200) ぐらい

です。

掲示板なので、処理の許容時間は 0.5秒ぐらいです。

もし、負荷が高くて間に合いそうにないのであれば、もっと効率の良い方法を教えていただけるとうれしいです。

926:NAME IS NULL
07/04/27 05:47:05
>>925
SQL一発でビュー作って終わりじゃん。 基本のキみたいなSQLだよ。
100回とか関係ないし。
それとテーブル3の板番号は冗長でんな。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4344日前に更新/269 KB
担当:undef