2010-01-01から1年間の記事一覧

php5.3をインストールする時の注意点

PHP 5.3はそんなに変わらないだろうとタカをくくっていたら、地雷を踏んだのでメモ。まぁ個人ブログなので問題なし。 Assigning the return value of new by reference is deprecated WordPressの場合以下のファイルを書き換える wp-settings.php

MySQLでマテリアライズドビュー10 実装編 定期更新(cron編)

MySQLのイベントスケジューラーがいつも使えるとは限らないので、cronでの定期更新の方法を記載しておきます。イベントスケジューラーより簡単ですね。 アクセス集計マテリアライズ化 # 毎日0時に実行 0 0 * * * /bin/sh echo "call access_daily_materializ…

MySQLでマテリアライズドビュー9 実装編 参照更新(on demand)

Oracleのマテリアライズドビューのパターンにない方法として、SELECT文実行前にマテリアライズドビューを更新するという方法がある。このパターンはon demandの一種でマテリアライズド・ビューの更新が滞っていると、参照までに時間が掛かるという弱点はある…

MySQLでSELECTトリガー

MySQLではINSERT、UPDATE、 DELETEとトリガーが実装されていますが、SELECTのトリガーは実装されていません。というかSELECTトリガーってなんだよっ!Oracleあたりにはありそうですが、RDBMSでSELECTトリガーなんて言うものは僕も聞いたことありません。そも…

MySQLでマテリアライズドビュー8 集計クエリー実装編 定期更新(start with句・next句)

昨日の集計を行うように修正 DROP PROCEDURE access_daily_materialized_insert; delimiter // CREATE PROCEDURE access_daily_materialized_insert() begin replace into mv_access_daily (access_date,access_daily_num) select date_sub( curdate() , INT…

MySQLでマテリアライズドビュー7 集計クエリー実装編 手動更新(on demand)

トリガーを除去 DROP TRIGGER IF EXISTS `access_daily_materialized_insert` 本日分の集計を更新するreplace文を書く*1 REPLACE INTO mv_access_daily (access_date,access_daily_num) SELECT CURDATE() , count(access_id) FROM access WHERE CURDATE()=DA…

MySQLでマテリアライズドビュー6 集計クエリー実装編 即時反映(on commit)

集計クエリーでのマテリアライズド・ビューは実装が異なって来るので今回はこちらを実装してみましょう。例として非常にシンプルなアクセスログ集計を考えます。

MySQLでマテリアライズドビュー5 実装編 定期更新(start with句・next句)

前回のエントリーで作成した、ストアドプロシージャをMySQLのイベントスケジューラーに登録して実行してみます。 1時間に1回実行する CREATE EVENT e_comment_materialized_insert_hourly ON SCHEDULE EVERY 1 HOUR COMMENT 'updated materialized view each…

MySQLでマテリアライズドビュー4 実装編 手動更新(on demand)

さて、前回のMySQLでマテリアライズドビュー3 on commitのエントリーにてマテリアライズド・ビューの一般的な形は紹介しました。先の例は高速化という意味では成功でした。ですが、世の中何事も等価交換(トレードオフ)です。参照の高速化の見返りとして、デ…

MySQL TIPS 6 ストアドプロシージャで指定した数のダミーデータを用意する3

ユーザ変数の文字列バッファ操作に時間が掛かっているので、一旦テンポラリーテーブルに格納してからgroup_concatでまとめて結合という手段を取ってみた。phpで言うところの配列(array)に格納しておいて、あとでimplodeでまとめて結合するというテクニックで…

MySQL TIPS 5 ストアドプロシージャで指定した数のダミーデータを用意する2 (失敗編)

以前のエントリーで作ったinsert_generate_seriesを複数INSERT,複数カラムで生成データを使用可能にしてみる

サブクエリーにLIMITを使った履歴系テーブルの高速化(MySQLでマテリアライズドビュー3 番外編)

履歴系テーブルは基本的にページャーでページ分割することがほとんどだと思います。前回のエントリーでもLIMIT句を使って30行だけ取ってきている例となっています。今回の問題点は、巨大なテーブル×巨大なテーブルのJOINをしようとするから重いのであって、…

MySQLでマテリアライズドビュー3 実装編 即時反映(on commit)

まずは簡単な履歴系のテーブルから実体化してみましょう例としてユーザのテーブルと紐づいているコメント機能を提示します。

今さらですが本BLOGを見ていただくより先に見ていただきたい方々のサイトを紹介致します。

MySQLの著名な方々にブックマークされてしまって戦々恐々としております名無しのIT系です。 今さらですが本BLOGを見ていただくより先に見ていただきたい方々のサイトを紹介致します。 sh2さんのSH2の日記 sakaikさんのsakaikの日々雑感〜(T)編 言わずと知れ…

MySQLでマテリアライズドビュー2

さてMySQLでOracleのマテリアライズドビューを再現するにあたり、マテリアライズドビューのモードによってそれぞれ再現方法が異なります。元となるクエリーが、集計クエリーなのか、複合クエリーなのか等によって、それぞれ内容が変わってきてしまいますが、…

MySQLでマテリアライズドビュー1

Oracleではマテリアライズドビューというビューを実体化させる機能があります。MySQLのビューにはマテリアライズドビューはありませんが、サマリーテーブルと(トリガー、イベントスケジューラー等)を組み合わせることによって同様な機能を実現可能です。この…

裏MySQLクエリー入門(26) 基礎編15 ダーティーリード

場面によっては、参照整合性が必要ない場合がある。その場面が、長時間のロックを要する場合、ダーティーリードにモードを切り替えることによってパフォーマンスを向上させることができることがある。要するにKVSと同じように参照整合性を犠牲にすることによ…

MySQL TIPS 4 ストアドプロシージャで指定した数のダミーデータを用意する

MySQLでブログを書いていてパフォーマンス系の記事を書こと思った時にダミーデータの用意をするのが面倒です。generate_series*1があれば簡単なのですがMySQLにはないのでストアドプロシージャで汎用的にダミーデータを生成できるものを作ってみました。以後…

裏MySQLクエリー入門(25) 基礎編14 俺々インデックスの作り方(関数インデックス)

MySQLでは、関数インデックスが使えません。そこで擬似的に関数(式)インデックスを作ってみることにしましょう。ユーザテーブルでメールアドレスを小文字にした時の関数インデックスを作る場合を例としてみます。メールアドレスをユニークにしたものの、大文…

裏MySQL クエリー入門 (24) 基礎編13 GROUP BY

今更GROUP BY?というのはごもっともな話です。普通のGROUP BYはマニュアルを見ていただくとして、ここでは裏MySQL クエリー入門的なGROUP BYのサンプル例をいくつか紹介していきましょう。 日毎に集計するには SELECT DATE(access_time), count(access_id) …

MySQL TIPS 3 空間情報(geometry)を使って経度・緯度の検索を高速化する

以下のようなピタゴラスの定理を使った指定した経度緯度に最も近いデータを取得するSQLは結構ありがちですが、CPU負荷が高く効率も悪いのでMySQLに標準搭載となった空間情報(geometry)を使ってみることにします。 SELECT * FROM loc ORDER BY power(abs(lati…

MySQL TIPS 2 1レコードのデータ内容で別のレコードを更新

今回はクライアントから、そんなの簡単じゃないの?という程度に依頼されるが、実は結構めんどうな うっとぉしい依頼の解決方法ついて解説します。 UPDATE event e1,event e2 SET e1.event_name=e2.event_name, e1.event_flg=e2.event_flg WHERE e1.event_id…

MySQL TIPS 1 怪盗ロワイヤルのように3分に1ポイント回復

MySQLネタもそろそろ尽きてきたので、趣向を変えてMySQLの実践Tipを紹介していこうと思います。 まずは怪盗ロワイヤルのように3分に1ポイント回復する実装について以下のように3分に一度バッチを回して、全ユーザの体力を+1ずつアップデートするのは効率が悪…

裏MySQLクエリー入門(22) ユーザ変数を使った経験値テーブル

CREATE TABLE `lv` ( `lv` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'レベル', `exp` INT NOT NULL COMMENT '必要経験値' ) ENGINE = MYISAM COMMENT = 'レベルテーブル'; INSERT INTO `lv` (`exp`) VALUES ('100'),('200'),('350'),('600'),('900'…

裏MySQLクエリー入門(21) 応用編6 ユーザ変数を使ったランキングの順位付け

ユーザ変数を使う代表例としてランキング系のテーブルで順位表示をしたい場合 以下のようなランキングテーブルを用意します。 CREATE TABLE `ranking` ( `ranking_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ランキングID', `category_id` INT N…

裏MySQL入門(20) 基礎編12 テンポラリーテーブル

テンポラリーテーブルはその名のとおり、DB上に一時的にデータを格納するテーブルを作成する機能です。テンポラリーテーブルは『create temporary table テーブル名』とcreate table文にtemporaryを指定することで作ることができます。 この作成されたテーブ…

裏MySQLクエリー入門(19) 応用編5 UPDATE文でカラムの値を入れ替えたい

CSVのインポートなどでカラム(列)の順番を間違ってしまったときなどに以下のようなSQLで値を入れ替えることができそうですが、 set @str = 0; update `charactor` set `str` = `grd`, `grd` = `int`, `int` = `agi`, `agi` = `dex`, `dex` = `vit`, `vit` = …

裏MySQLクエリー入門(18) 応用編4 バルクアップデート(2)

前回のエントリーでINSERT ON DUPLICATE KEY UPDATEを紹介しましたが、これを使うとeltやfieldを使ったバルクアップデートではなく、重複するキーが既に存在するという前提であれば、バルクアップデートとして使用できます。用途としては、CSVアップロードや…

裏MySQL入門(17) 基礎編11 REPLACE or INSERT ON DUPLICATE KEY UPDATE

MERGE,UPSERTと言われる、UPDATE文とINSERT文を条件によって自動的に切り替えることができるSQL文は、MySQLでは2種類用意されています。 REPLACE、INSERT ON DUPLICATE KEY UPDATEです。それぞれの違いは REPLACE INSERT文と同じ構文でINSERTの部分をREPLACE…

phpでFizzBuzz

最近は、必ずといってもいいほどあるプログラムの実技試験。 phpでFizzBuzzをおさらい。 といってもただ単にやっても面白く無いので、forを使わないで配列を用いた天邪鬼ver