日向夏特殊応援部隊

俺様向けメモ

MySQL

MyTAP + my_prove + MySQL::Sandbox で快適 SQL Unit Testing

MyTAP という MySQL 上で Test Anything Protocol を実現してしまうというプロダクトがあります。これと TAP::Parser::SourceHandler::MyTAP に付属している my_prove コマンドを使うとかなり簡単に SQL プログラミングでテストを行う事が出来ます。また MyS…

replication status plugin のインストール

Replication Status Plugin という物がありまして、SHOW SLAVE STATUS で取れる値が information_schema.SLAVE_STATUS テーブルから取れるよって代物です。SHOW 系のコマンドって変数代入出来ないから SQL でホゲホゲする事が出来ないんですよね。なのでこう…

変数とストアドプロシージャについて

追記しました (2011-08-08T16:57:50Z)割と弊社では MySQL の event scheduler を使ってみたり、ストアドプロシージャ、トリガーなど積極的に使っています。 今回はストアドプロシージャを書く上で、変数を色々使うのですが備忘録としてメモっておきます。MyS…

SET TIMESTAMP 構文で時刻の固定

SELECT * FROM hidek WHERE created_on < UNIX_TIMESTAMP() - ? ORDER BY created_on ASC LIMIT 100; とかそういうクエリをテストしたい場合、Fixture の日時が固定値だと色々と不都合がありますね。そういう時は、http://dev.mysql.com/doc/refman/5.1/ja/s…

Range Partitioning と日付型の選び方

だいぶ前に身を持って知った訳ですが、どう見ても BK なのでここに書いておきますよと。 型 データサイズ 日付演算 1日未満の分割 刈り込み (pruning) datetime 8 byte ○ × ○ timestamp 4 byte ○ ○ × uint(10) 4 byte × ○ ○ 1日未満の分割が必要無く、データ…

カラム数の多いテーブルの SELECT 用にカラムを明示的に列挙する、または GROUP_CONCAT() が便利と言う話

カラム数が結構多いテーブルに対して SELECT * とは書きたく無くて明示的にカラム名を指定したいって時に徒手空拳で頑張って書いても良いんですけど、information_schema 使えば楽出来るよねーって話。 CREATE DATABASE akb48; USE akb48; CREATE TABLE memb…

SQL だけで動的に ADD PARTITION する

DEALLOCATE PREPARE し忘れていたので修正しました。id:tokuhirom++結論から言えば プリペアド ステートメントの為の SQL 構文 を使えば出来る。 CREATE TABLE `timeline` ( `id` int(10) unsigned NOT NULL, `guid` int(10) unsigned NOT NULL, `title` var…

Time::Piece::MySQL とタイムゾーン (訂正あり)

重要id:holidays-l さんがこの記事の誤りと、ちゃんとした解説を書いてくれているので、そっちを参照して下さいませ。以下、そのつもりで読んで下さい。MySQL から UNIX_TIMESTAMP() と NOW() の値をこんな感じで出します。 [12:13:13 root@bopobo/test :4] …

Partitioning と information_schema.PARTITIONS のメモ

例によって information_schema に partitioning されたテーブルの情報がある訳ですが、ちょっとメモ。ちなみに SQL としてはこんな感じです。 SELECT PARTITION_NAME, SUBPARTITION_NAME, PARTITION_ORDINAL_POSITION, SUBPARTITION_ORDINAL_POSITION, PART…

今日の MySQL - Partitioning 編 -

さてと、ありがちな下記のようなテーブルを作ってみます。ちなみに 5.1.45 で試してます。 DELIMITER ; DROP TABLE IF EXISTS diary; CREATE TABLE diary ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `subject` varchar(64) NOT NULL, `content` text…

information_schema から trigger の定義を取得する

PROCEDURE/FUNCTION の場合は何も気にせず SHOW CREATE PROCEDURE とかで取得出来るんですが、TRIGGER の場合はそれ相当のステートメントが存在しません。発火するタイミング (BEFORE/AFTER) と発火するイベント (INSERT/UPDATE/DELETE) とかあるからシンプ…

MySQL の複合 DELETE 構文

1ヶ月半ぶりのエントリです。皆さんお元気ですか? 何故か最近 Eclipse ばっかり使ってる zigorou でございます。12.2.1 DELETE 構文 を見ていたら複合 DELETE 構文ってのが有ったので試してみました。前提としてレコードがうんざりする程多いテーブル、、、…

MySQL Replication with Test::mysqld

やってみたかったからついやってみた。 #!/usr/bin/perl use strict; use warnings; use Data::Dump qw(dump); use DBI; use Test::More; use Test::Exception; use Test::mysqld; use Test::TCP; sub setup_master { # http://dev.mysql.com/doc/refman/5.1…

q4m を rpm 化する with checkinstall

作業メモです。 src.rpm の取得 # cd /usr/src/redhat/SRPMS # wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-community-5.1.42-0.rhel5.src.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/ rpmbuild --recompile ビルド時のソースツリーが必要な…

SQL_CALC_FOUND_ROWS を毎回忘れるのでメモっておく件

LIMIT 〜 OFFSET なんか使う SELECT 文をページ送りとかしたい場合、全体の件数が必要だったりして、 SELECT * FROM people LIMIT 50 OFFSET 0; SELECT COUNT(guid) FROM people; みたいな感じの事やりたい訳だけど MySQL の場合だと、そういう枠組みがある…

初めての Q4M, Test::mysqld を使ったテストの準備

id:kazuhooku さんの指摘 *1 を受けて transaction してた所を修正。AutoCommit をとりあえず 1 にしておきました。 #!/usr/bin/perl use strict; use warnings; use DBI; use Perl6::Say; use SQL::Abstract; use SQL::Abstract::Plugin::InsertMulti; use …

MySQL::Sandbox (2)

MySQL::Sandbox - Yet Another Hackadelic の続きです。 make_replication_sandbox でレプリ環境をサクっと作る レプリ環境もサクっと作れます。前と同じバイナリがあるとしたら、 $ make_replication_sandbox /home/zigorou/tmp/mysql-5.0.82-linux-i686-gl…

MySQL::Sandbox

MySQL::Sandbox はお手軽に MySQL のサーバーを立ち上げるツールで、ちょっとしたテスト環境を構築するとかに非常に便利なプロダクトです。 とりあえずインストール $ sudo cpan -i MySQL::Sandboxでインストールしてから OS ごとの実行バイナリをダウンロー…

Re: MySQL最適化のミニtips

元ネタ: http://labs.unoh.net/2007/07/mysqltips.htmlあまり具体的じゃないので、僕の考えとか。 正しいかどうかは各自の状況だとか実際試すべきなんだけど、参考になれば。 MyISAM、InnoDBなどテーブルタイプ 僕は断然InnoDB派です。 ただ仰るとおり、ログ…

DBD::mysqlをOSXにインストールする途中でハマったの巻

もう何度これでハマったか分からん位、DBD::mysqlってcpanで入れられない時にハマる率が高いんですけども、とりあえず僕の環境での話。 OSX 10.4.9 Perl 5.8.6 MySQL 5.0.41 (dmg形式の奴) で結論ですけど、d:id:nskj77:20070527:1180276582 に書いてありま…

InnoDBの複合FOREIGN KEY制約について

今回はInnoDBなら是非使いたい機能のひとつ、FOREIGN KEY制約の話です。 まずはテーブルを用意 Fooと言う複合primary keyを持つテーブルを用意したとします。 CREATE TABLE `Foo` ( `a_id` int(11) NOT NULL default '0', `b_id` int(11) NOT NULL default '…

AES_ENCRYPT, AES_DECRYPT可能な暗号をPerlで行う

はじめに MySQLの関数にAES_ENCRYPT, AES_DECRYPTってのがあります。AES_ENCRYPT, AES_DECRYPTRijndaelを128bitのkeylengthでECBで暗号化する関数です。 AES_ENCRYPT mysql> SELECT HEX(AES_ENCRYPT('hogehoge', 'abcdeabcdeabcdea')) AS encrypted; +------…

FedoraCore6でMySQL5.0のレプリケーション設定

と言うかiptablesではまったの巻。 master側の設定 masterにしたいDB側で、とりあえず下記の設定を/etc/my.cnfに入れておく。 log-bin=mysql-bin server-id = 1次にreplication用のユーザーを追加しておきます。 mysql> GRANT REPLICATION SLAVE ON *.* TO '…

コンソールの小ネタ

mysql のメタコマンド『\G』 : おまえのログ http://neta.ywcafe.net/000646.html MySQLの方はisbn:4873112095に書いてあったので、前から知ってたんだけどPostgreSQLの方は知らなかった。 コンソールでのテクニックって色々ありますよねぇ。 一番BKが多そう…

varcharとutf8

ちとvarcharのutf8を誤解してました。 CREATE TABLE bar ( id int(11) NOT NULL default '0', name varchar(4) default NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8こんな風にテーブル作った際に、マルチバイトだろうが半角英数字だろうが…

効率的なインデックスの生成と管理について

不思議とアプリケーションチューニングに置いて、余り語られていないINDEX化ですが、 意外ときちんと調べて見ると色んな機能があるんだなと再認識させられます。 複合INDEX 例えば複合INDEXなんかですが、 多くのプログラマが勘違いしていたりとか、あるいは…

異なるdatabaseにまたがるtableのcolumnに対して外部キーを張る

当たり前ですけどInnoDBの話です。 ちなみにMySQL4.1xで試したので、それ以上ならばきっと出来ると思います。下記のようにfooって言うdatabaseにaテーブルを作る。 create database foo; create table foo.a ( id int primary key, name text ) TYPE = InnoD…