MySQLでlimitを使用したデータ件数カウント(SQL_CALC_FOUND_ROWS)

今回はMySQLのTipsです。

Webサイトの検索画面などで、
「50件/10000件中ヒットしました。」
という画面を作る場合にとても便利なMySQL関数です。

例:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;

mysql> SELECT FOUND_ROWS();

これだけでOK。

■1回目のSQLでは、LIMITを含むSELECT文の先頭に
「SQL_CALC_FOUND_ROWS」というオプションをつけて実行します。

これでいつも通り、特定の条件で絞り込んだ結果の先頭n件のデータが取得できます。

データ件数を取得する場合は、PHPならmysql_num_rows()でカウントできます。

 

■2回目は「SELECT FOUND_ROWS();」という関数をコールします。

これで1回目のSQLでLIMIT指定していない場合の全件数が取得できます。

通常は別途「SELECT count(*) FROM table_name」なんて再度実行する必要が
あるのですがその必要はありません。

 

よくプログラムでwhere句を変数にもっておいて、
「select a,b,c~」と「select count(*)~」の2種類のSQLにつけて
select文を2回実行するというプログラムを作っていました。

同じ条件のSQLを実行するなんて無駄だな~。と思っていたのですが
MySQLくんは用意してくれています。すごくいい子です。

 

MySQLのマニュアル
http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html

 

要するに同じ条件のSQLを2回実行する必要がないため、
超高速です。

MySQLを使用した検索画面を作っている人は、パフォーマンス改善のためにも
とても有効な関数ですので検討してみてください。

| | コメント (0)

Re:行列のできる店のラーメン 山形

売ってた。行列のできる店のラーメン 山形

ずっと探し続けていた訳ではないのだけど、たまたま行った近くのスーパーに

あの伝説のラーメンが売ってた。

日清行列のできる店のラーメン 山形

その日は、行列のできる店のラーメン フェアみたいで
(勝手に思ってます。)

北から順に
行列のできる店のラーメン 札幌
行列のできる店のラーメン 山形
行列のできる店のラーメン 横浜
行列のできる店のラーメン 和歌山
行列のできる店のラーメン 京都
行列のできる店のラーメン 博多
行列のできる店のラーメン 熊本

がワンコーナー埋め尽くしていました。

超ラッキー。ありがとうスーパーマーケッツ

ということで、みそラーメン好きの私としては
札幌と山形をチョイス。

帰り道の足取りも軽く。スキップしながら家に帰りました。

山形のおいしさは以前から立証済みだったので、まず札幌から食べてみました。

感想。。。。。

おいしいのだけどね。インパクトがもの足りない。

普通に売っている
行列のできる店のラーメン こってりみそ

との違いがあまりなし。せっかくご当地の名称をつけている割には
そこそこおいしい普通のみそラーメンではないか。

なんとなく不完全燃焼なので、やっぱりここは山形でしめることにしました。

一口目は辛みそなしでスープを一口。

おおお。。。これだよ、これ。ぼくが求めていたものは。

この煮干からとった深い味わいの濃厚みそ。

二口目。辛みそを溶いて一口。

うめ~。やっぱりこれだよ。

この煮干ダシの濃厚みそスープに、ちょっと太目のかんすいがきいた麺が

とてもいい感じにからみあって。オーケストラのバイオリン4重奏のような

すばらしいハーモニーが口いっぱいに広がり、

心もおなかも幸せな気分にいざないでくれます。

ああ、幸せ。

会いたかったよ。I miss you
恋におちたよ。Fall in Love

やっぱり君じゃなきゃだめだ。
これからも君を探し続けるよきっと。

| | コメント (0) | トラックバック (0)

MySQLでレプリケーション(前置き)

MySQLの便利な機能はいろいろあるのですが、その中でも特に便利だなと思うのがレプリケーションです。
この機能があるからこそMySQLがここまで支持されているのだと私は勝手に思っています。

もちろん他のDBでも同様の機能は存在しますし、ORACLE、SQLserverではもっと高機能なClusterもあります。ただし数千万円というレベルで予算が必要です。

確かに100%のデータを絶対に守らなくてはいけない場合には必要だとは思いますが、それが99%でよければレプリケーションで充分な場合がほとんどです。

Webのアプリケーションの場合、サーバ間のネットワークや、クライアントPCの状況など、もともとどんなに完璧なサーバを用意しても100%をカバーするシステムを構築することは不可能です。

もちろんお客様は100%の稼働率を求めてきます、ただし99%でよければのいかに予算を削減できるか、他の機能を増強できるか、しいてはSE、プログラマーがやる気をもって仕事にとりくめるか、どちらがメリットになるか説得してみてください。

お客様の要望どうりに仕事をこなすのがSEではありません、お客様と開発会社の両方をハッピーにするのがSEの仕事です。

話しがいろいろそれましたが、次回以降に何回かに分けてMySQLのレプリケーションについて書いていこうと思っています。

| | コメント (0) | トラックバック (0)

MySQLでOracleのrownumやSQLServerのTopを実現する

グリッドのページ送りをしたいときや、大量データのテーブルなどで取得データの件数を制限したい場合ありますよね。

OracleではROWNUMで、SQLserverではTOPというキーワードがあります。

もちろんMySQLにもあります。それが「limit」。どちらかというとSQLserverのTOPに近い感じかな。

MySQLマニュアル

[1] 先頭から10件を取りたい場合。

select * from test
where aaa = '1'
   order by key01
   limit 10

[2] 最後から5件を取りたい場合。

select * from test
where aaa = '1'
   order by key01 desc
   limit 5

[3] 先頭から100件目~150件目を取りたい場合。

select * from test
where aaa = '1'
   order by key01
   limit 100, 150

引数が1つでも2つでも勝手に解釈してくれます。さらに応用でこんなこともできます。

データをランダムに10件取得する。

select * from test
where aaa = '1'
   order by rand()
   limit 10

MySQLの関数「 rand()」でランダムに割り当てて並び変えて先頭を取得でおしまい。

ほかのデータベースで同じ事を実現しようとすると、なかなか大変です。

やっぱり便利。MySQL。

| | コメント (0) | トラックバック (0)

行列のできる店のラーメン 山形

今日は箸休めで、システムとは関係ありません。

たまたま近所のスーパーで売っていたので、購入。

日清 行列のできる店のラーメン 山形 からみそ味

結果。予想以上にかなりうまい。

かなり山形の「龍上海」を意識している感じで、
にぼしのダシがきいている濃厚みそスープ。これだけでもそこそこうまいみそラーメンなのに、付け合せの辛みそが、さらに辛さとうまみを向上させていてうまかった。

山形の「龍上海」思い出した。

「辛みそラーメン」好きの人は絶対おすすめ。
個人的には辛みそを増量してほしいくらいかな。

でも気になることが。

スーパには残り1個だけだったし、パッケージには期間限定と書いてあるし、日清のホームページにも乗ってないし売り切れたら食べれないよ。

なんとかなりませんか日清さん。

近くのセブンイレブンでも半年前くらいから山形「龍上海」の
お店のカップラーメンが売っていて、あの商品の入れ替えが激しい
コンビニで半年以上も並んでいるなんて人気がある証拠

2008年は「辛みそラーメン」ブームが来るなと勝手に思い込んでいます。

| | コメント (0) | トラックバック (0)

SQLserver2005をWindows2000 Proにインストール

SQLserver2005の案件がありインストールしてわかったこと。

Windows2000 Professional のサーバが空いていたので、試しにインストールしました。

とりあえず最新のWindows Updateをあてて、 IISもインストール。

CDからインストーラーを起動。

インストール準備画面が起動してMicrosoft Windows .NET Framework 2.0をインストール。

インストールチェックも全てOK。

まあここまでは順調。

その後、インストールするツール等を選んで、実行ボタンを押すとエラー発生。

.NET Frameworkを再度インストールし直してください。

え。。さっき入れたじゃん。

仕方ないので、Microsoft Windows .NET Framework 2.0 SP1にUPDATEした。

また、CDから起動し直して、先ほどのエラーが出たところまでゆく。

今度は、インストールが始まる。(よかった)

小一時間ほどしてインストールが完了。

やっと終わったので、接続用のユーザを作成しようと思い、管理画面からユーザ作成をおこなう。

ところがここで、このバージョンのWindowsではサポートされていませんというエラーメッセージでユーザが作れない。

ひどい。ひどいよ。インストールできたじゃん。

多少いろいろ調査しましたが、エラーがあまりに多く、Windows2000 Professionalでインストールするのはあきらめました。

せっかくインストール時のチェックやっているのだから、その時点でだめならだめと教えてくれよ。まる1日無駄にしてしまった一日でした。

microsoftインストール要件

| | コメント (0) | トラックバック (0)

Google Chartsでグラフ

Google Charts

やっぱりでたな~。
はてなグラフでた頃にもう少し高機能なもの作ったら面白いだろうなと思いながら約1年。完成できなかったけど。googleさんが作ってくれた。

機能も豊富で、レスポンスも文句なし。さすがです。

日本語も感じは”??”になってしまうが「ひらがな」「カタカナ」は表示できた。

方法は

1.「ひらがな」「カタカナ」をUTF-8でURLエンコードする。

「Web便利ツール 」こちらのサイトで変換できます。

2.APIのパラメータにエンコードされた文字列を渡す。

これでOK。そのうち漢字も対応されるでしょう。

サンプル

http://chart.apis.google.com/chart?cht=p3&chd=t:90,49&chs=350x150&chl=%e3%81%b2%e3%82%89%e3%81%8c%e3%81%aa|%e3%82%ab%e3%82%bf%e3%82%ab%e3%83%8a

Google Charts はこちら

| | コメント (0) | トラックバック (0)

MySQLでUTF-8の設定方法

Red Hat Enterprise Linux 4
mysql 5.0.27での設定

RPMでインストールした場合、デフォルトのキャラクターセットはlatin1となる、UTF-8にしたい場合は下のように設定ファイルに追加する必要がある。

/etc/my.cnf

[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

 

「default-character-set=utf8」だけでいけるとおもったら、クライアントのキャラクターセットが「latin1」になってる。
そこで調べたら「skip-character-set-client-handshake」という設定が必要なんだとわかった。

「skip-character-set-client-handshake」はクライアントから接続したときにクライアント側の文字コードを「default-character-set」で指定されたものに自動設定するオプションなんだって。これは知らなかった。

| | コメント (0) | トラックバック (0)

Apacheアクセス制限はじめました

某Webサイトの抽選ページを作成しているのですが、
最近不正アクセスが増えてきてサーバの負荷が上がって困っています。
そこで不正ユーザのアクセス制限をかけようと調査したTips。
とりあえず、特定のIPアドレスだけをApacheで制限をかけることにしました。

googleで調べていたのですが、「特定のIPアドレスだけ許可する」というページはよく見かけたのですが今回は「特定のIPアドレスのみ許可しない」ということがやりたかったのです。

<Directory />
    <Location /abcdefg>
        ErrorDocument 403 /error/403.html
        order allow,deny
        allow from all
        deny from 192.168.0.100
    </Location>
</Directory>

こうすれば特定のディレクトリのみの制限ができるし、エラー用のHTMLも隠蔽できる。 mod_rewrite使うのと比べて圧倒的に軽いしね。


不正アクセスは自動テストツールなどで、1日20万回以上もアクセスが来ている。今はツールなのにブラウザ経由でアクセスできる高機能のものもフリーでダウンロードできる世の中。イタチごっごになるのだろうな。


不正アクセスしているユーザさん。単なるランダムで当選するような、しょぼい抽選ページ作ってないよ。不正アクセスしても無駄なのに。
もちろん当選者は平等の抽選をしています。不正や偽装はしていません。

| | コメント (13) | トラックバック (0)

はじめました

始めました。
日ごろのもやもや含め、システム開発のちょっとした情報などを書いてゆこうと思ってます。

| | コメント (0) | トラックバック (0)