MySQL: Cloud サービス 「Xeround」を実際に使ってみた

Scalability and High Availability for your MySQL Database in the Cloud
MySQLクラウドサービスがあることを知ったので、実際に使ってみたログ。

MySQLクラウドとは、
client=データを扱う側=connectする側
から見ると
server=データを格納する側=connectされる側
が1台のMySQLに見えるってことのようです。

server側のスケールアウトともなう作業などがなくなるので
非常に手間が減ってうれしいことこの上ない。
が、実際に使ってみないとなんとも言えないので、早速使ってみた。

まずは、サイトに移動してみる。
今はまだBeta版。






アカウントを作ってみるわけですが、
クラウド的な質問が最後に2つ。













データベースの容量をいくつにするか
予想量を記入しないといけないみたいです。

特に考えてないので、
10GB以上を選択しておきました。




もうひとつが、クライアント側のサーバがどこにあるか、
ということを入力する必要があるみたい。
某レンタルサーバや自宅サーバから
つないでみるつもりだったので
「On-premise data center」
を選択したけど、これでよかったのかは謎。
「Other Cloud or Hosting」の方がよかったのかも?

これで、アカウントが作成完了した。










ログインすると上記のような画面になる。初期状態では、databaseがないので、
右上の「+ Create New」でdatabaseを作成する。

作成するときにも、いくつか質問が。

まずは、DB Instanceの初期サイズ。
500Mから変更できないフィールドでした。
たくさんデータを入れてみたいので、
「I want a larger DB Instance during beta」
にチェックをいれておきました。











あとは、データセンターの場所。
XeroundはAmazon EC2の上に
構築されているので、そのデータセンターを
選ばないといけないようです。


選択肢は2つ、アメリカの東か、EU(ヨーロッパのどこか?)の西、の2つ。
どっちも日本から遠そうだなー、と思ったんですが、とりあえず、US Eastを選択しておきました。

というわけで入力完了したので、「Create DB Instance」ボタンを押下すると、
以下のような画面に。













初期化にはしばらく時間がかかるようで、「Initializing(22%)」と表示されて、
100%になるには、2分程度かかりました。
画像上は消してますが、作成したInstance ID, User name, DNS name, Internal IPs
が表示されてます。

Initializingが無事に終了したら、
DNS namesに表示されているサーバにmysql connectしてみます。
自分の場合、2つのDNS namesが表示されましたが、どちらでも
connectできました。

/home/satoshi/Documents% mysql -u*** -h ***.amazonaws.com --port=*** -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.1.42 Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

MySQLのバージョンは、(少なくても2011/01現在で)5.1.42みたいです。

次、文字コードを確認。

mysql> show variables like '%char%' \G
*************************** 1. row ***************************
Variable_name: character_set_client
        Value: utf8
*************************** 2. row ***************************
Variable_name: character_set_connection
        Value: utf8
*************************** 3. row ***************************
Variable_name: character_set_database
        Value: latin1
*************************** 4. row ***************************
Variable_name: character_set_filesystem
        Value: binary
*************************** 5. row ***************************
Variable_name: character_set_results
        Value: utf8
*************************** 6. row ***************************
Variable_name: character_set_server
        Value: latin1
*************************** 7. row ***************************
Variable_name: character_set_system
        Value: utf8
*************************** 8. row ***************************
Variable_name: character_sets_dir
        Value: /opt/xeround/sys_***/v***/xdrm/mysql-***/share/mysql/charsets/
8 rows in set (0.25 sec)

mysql> set character_set_database=utf8;
Query OK, 0 rows affected (0.44 sec)

mysql> set character_set_server=utf8;
Query OK, 0 rows affected (0.37 sec)

latin1になってるので、utf8に変更しておきました。
個人の好みにどうぞ。

次、ユーザ。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.21 sec)

mysql> use mysql;
Database changed

mysql> select User,Host from user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| root        | localhost |
| *******     | %         |
| xeround_xms | %         |
+-------------+-----------+
3 rows in set (0.39 sec)

mysql> show slave status;
ERROR 1227 (42000): Access denied; you need the SUPER,REPLICATION CLIENT privilege for this operation

*******は自分が作ったユーザー、
xeround_xmsはすでに作成されてたユーザー。
xeround_xmlはHostが%なので、権限が気になったけど、Select権限しかありませんでした。

*******が持っていない権限が以下。これ以外はYでした。
        Shutdown_priv: N
         Process_priv: N
            File_priv: N
           Super_priv: N
      Repl_slave_priv: N
     Repl_client_priv: N
なので、
mysql> show slave status;
ERROR 1227 (42000): Access denied; you need the SUPER,REPLICATION CLIENT privilege for this operation
などと、エラーになります。

最後に、データを投入してみます。
/Users/satoshi% ls -l web2.sql
-rw-r--r--  1 satoshi  staff  117156703  1 25 23:20 web2.sql

# localのMySQLにデータを投入
/Users/satoshi% time mysql -uroot web2 < web2.sql
1.98s user 0.36s system 2% cpu 1:43.67 total

# Xeroundにデータを投入
/Users/satoshi% time mysql -u*** -p --port=*** -h ***.amazonaws.com web2 < web2.sql
Enter password:
1.97s user 1.28s system 0% cpu 41:36.71 total

と、117Mのデータ投入に40分以上かかっちゃいました、という結果に。
(参考に、Local MySQLに投入すると、2分弱)
環境は、Mac snow leopard + mac port mysql

単純に、性能が悪いのか、最近始まったサービスなのでアクセスが多くて重いのか、
ネットワークが遠いから、なのかまではちゃんと調べてないので、
あくまで参考程度に。

アカウントの作成や、データの投入は問題なくできたので、
今後もっと詳しくみていこうと思う。



参考:
クラウド対応のスケーラブルなMySQLデータベース、米Xeroundが発表 - Publickey

kvm環境セットアップ @ Ubuntu 10.10

手持ちのUbuntu Netbook 10.10にKVMで仮想環境を構築する必要があったので、
構築時の設定や手順を備忘録メモ。
まずはインストール。
/home/satoshi/kvm% sudo aptitude install qemu-kvm

で、終了。次に、ディスクイメージの作成。
/home/satoshi/kvm% kvm-img create -f qcow2 tanarky.img 8GB
Formatting 'tanarky.img',fmt=qcow2 size=8589934592 encryption=off cluster_size=0
/home/satoshi/kvm% ls -l tanarky.img
-rw-r--r-- 1 satoshi satoshi 262144 2011-01-23 11:26 tanarky.img
/home/satoshi/kvm% file tanarky.img 
tanarky.img: Qemu Image, Format: Qcow , Version: 2

qcow2形式で、8GB容量のディスクイメージを作った。
が、作成直後に8GBとられるわけではなく262kしかない。
必要な分だけ確保されるよう。

というわけで、早速インストール
/home/satoshi/kvm% kvm -hda tanarky.img \
  -cdrom /home/satoshi/Downloads/ubuntu-10.04.1-server-i386.iso \
  -boot d -m 384 -monitor stdio

cdromオプションで、ダウンロード済みのisoファイルを指定、
-boot dでisoから起動するように、
-mオプションでメモリサイズ384Mを設定、
-monitor stdioは特に必要ないかも。

で、インストールが完了したら、起動。
/home/satoshi/kvm% kvm -hda tanarky.img \
  -boot c -m 384 -redir tcp:2222::22 -redir tcp:10080::80
-hdaオプションで、作成+OSインストール済みのイメージファイルを指定、
-mオプションでメモリサイズ指定、
-redirオプションでポートフォワードを設定
(HOSTの2222をGUESTの22へ、HOSTの10080をGUESTの80へ)

Ubuntu Serverは空っぽinstallしたので、sudo aptitude install sshしないと、
ポートフォワードを設定してもsshログインできませんでした。

無事、そんなにはまらずにセットアップ完了。
VirtualBoxと合わせて使ってみようと思う

参考:
KVMを使う(インストール編) « さくらインターネット研究所
@IT:KVMの導入と基本的な使い方(1/3)
Ubuntu + KVM で仮想サーバ

Perl: WebService::Bloggerをインストールして、Perlからbloggerを更新する

PerlスクリプトからBloggerを更新したかったので、CPANをあさったところ、

WebService::Blogger - search.cpan.org

を見つけたので、レンタルサーバでinstallして、動かしてみた。
まずはinstall。
% sudo cpan Test::NoWarnings
% sudo cpan List::MoreUtils
% sudo cpan Dist::CheckConflicts  
% sudo cpan Package::Stash
% sudo cpan Moose
% sudo cpan WebService::Blogger 

依存関係を解決してくれなかったり、installの途中でyesと打たないといけなかったり、
コマンド1発でinstallする方法を未だに知らないが、とりあえず先に進む。

次に準備。
~/.www_blogger_rcを以下のように用意して
% cat ~/.www_blogger_rc
username = someone@gmail.com
password = **パスワード**
permissionを400とかにしておく。

CPANのドキュメントによると、new()の引数にlogin_idとpasswordを指定すると動く
みたいに書いているが、動かない。
cpan - Perl WebService::Blogger - Stack Overflow
どうやらBugらしい。

で、サンプルコード
perl/blogger at master from tanarky/sample-codes - GitHub

無事に更新できたことを確認。
これでPerlからbloggerを更新できそう。

Net::Bloggerとかもあるが、どっちがいいんだろ。

Java: 今のclasspathをJava側で確認する

java側から、現在設定されているclasspathを確認したかったので、
サンプルコードを書いてみた。

自分で調べた限り、一撃で取得できる関数みたいなのはなさそうだった。
System.out.println("classpath = " + prop.getProperty("java.class.path", null));
実行結果:
/home/satoshi/github/sample-codes/java/system_properties% ant exec
Buildfile: /home/satoshi/github/sample-codes/java/system_properties/build.xml

mkdir:
    [mkdir] Created dir: /home/satoshi/github/sample-codes/java/system_properties/build/classes

compile:
    [javac] Compiling 1 source file to /home/satoshi/github/sample-codes/java/system_properties/build/classes

exec:
     [java] Hello, Java.
     [java] classpath = /usr/share/ant/lib/ant-launcher.jar:/usr/share/java/xmlParserAPIs.jar:/usr/share/java/xercesImpl.jar:/usr/share/ant/lib/ant-javamail.jar:/usr/share/ant/lib/ant-antlr.jar:/usr/share/ant/lib/ant-stylebook.jar:/usr/share/ant/lib/ant-apache-bsf.jar:/usr/share/ant/lib/ant-apache-log4j.jar:/usr/share/ant/lib/ant-apache-bcel.jar:/usr/share/ant/lib/ant-apache-resolver.jar:/usr/share/ant/lib/ant-apache-regexp.jar:/usr/share/ant/lib/ant.jar:/usr/share/ant/lib/ant-apache-xalan2.jar:/usr/share/ant/lib/ant-launcher.jar:/usr/share/ant/lib/ant-apache-oro.jar:/usr/share/ant/lib/ant-jsch.jar:/usr/share/ant/lib/ant-jdepend.jar:/usr/share/ant/lib/ant-commons-logging.jar:/usr/share/ant/lib/ant-trax.jar:/usr/share/ant/lib/ant-jmf.jar:/usr/share/ant/lib/ant-swing.jar:/usr/share/ant/lib/ant-commons-net.jar:/usr/share/ant/lib/ant-junit.jar:/usr/share/ant/lib/ant-nodeps.jar:/usr/lib/jvm/java-6-sun-1.6.0.22/lib/tools.jar
     [java] baz

BUILD SUCCESSFUL
Total time: 3 seconds

/home/satoshi/github/sample-codes/java/system_properties% java -version
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)
サンプル:
https://github.com/tanarky/sample-codes/blob/master/java/system_properties/src/SystemProps.java

環境は、Ubuntu 10.10
sun-java6-jdk
  バージョン: 6.22-0ubuntu1~10.04

参考:
Java Get Class path

MySQL: 改行を含むデータのload data local infile

改行を含むデータをload data local infileしたかったので、
ちゃんとマニュアルを読んでみました。

サンプルテーブルは以下。
mysql> show create table test2 \G
*************************** 1. row ***************************
       Table: test2
Create Table: CREATE TABLE `test2` (
  `id` int(11) NOT NULL,
  `desc` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

このテーブルに、以下のようなテキストファイルを作成。
/tmp% less test2.dat 
1       あああ
いいい
ううう^A2       えええ
おおお

データ間はタブで区切って、
^A = Ctrl-A = 0x01 で行を区切ったデータを取り込んでみる。
mysql> load data local infile '/tmp/test2.dat' into table test2 lines terminated by 0x01;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from test2 \G
*************************** 1. row ***************************
  id: 1
desc: あああ
いいい
ううう
*************************** 2. row ***************************
  id: 2
desc: えええ
おおお

2 rows in set (0.00 sec)

無事取り込み完了。
0x01はシングルクォートやダブルクォートでくくらないのが(強いて言えば)ポイントか。

以上、自分用メモ。



読了: 遠藤 保仁 「信頼する力 ジャパン躍進の真実と課題」

連日アジアカップのサッカーを観戦してる中、ふと立ち寄った本屋で、
サッカー日本代表 遠藤 保仁 の本を発見したので速攻購入。



元サッカー日本代表の中村俊輔や棋士の羽生善治も出版している
「○○力」シリーズということみたいです。スポーツなどで名を馳せた人が
その人の経験や思考を元に書く本で、本屋で見かけるたびに速攻買って読んでます。

なかなか、興味深い内容で、内容も濃く、非常に面白かったです。
以下目次抜粋
第1章 南アフリカワールドカップの真実
      選手と岡田監督の深い絆
      本番直前まで続いたマスコミの個人批判
      「先行逃げ切り」しかないと思っていたカメルーン戦
      本田圭祐の決定力の高さ
      駒野友一のPK
第2章 信頼の力 監督とチームの関係
      「やる気」を演技する必要があったトルシエ
      選手起用が偏っていったジーコ
      やりたくなかった2列目で起用したオシム
      信頼感を一番感じた岡田監督
第3章 今の日本サッカーに不足しているもの
      日本と海外との環境の差
      「なんとなく」では通用しない意識の差
      コンプレックスに対する考え方
第4章 ザッケローニ・ジャパンへ
      驚いたイタリア人監督
      リーダーとしての振る舞い

※ 節の部分は抜粋。
全ページ200ページ程度の内容のうち、100ページが第1章のワールドカップに関する内容。

実際に、ドイツワールドカップも経験した選手による、
南アフリカワールドカップの現場で起こっていたことについての話は、
「そうだったんだ」という思いにさせられる。やっぱり、経験者の声は重みが違う。

また、トルシエからの日本代表歴代監督に対する個人的な意見を
素直に語っている部分は非常に面白かった。
1選手としての意見をここまで書いてくれるとは。

結構な内容なので、発表する時期を間違えると単なる監督批判になってしまうので、
この本は今じゃないと発行できない内容だな、と思った。

サッカーに詳しくなくても、遠藤を知ってる人なら、楽しめる内容だと思う。
おすすめ★★★★★

関連本:

antでwarningがでるのでbuild.xmlを修正

MacのJava環境でantでBuildするとwarningがでることに気がついた。
原因は以下らしい。

参考:
Memo/20100822030535/Ant 1.8から出るincludeAntRuntimeに関するワーニング - epian-wiki
結局の所、javacタスクにincludeantruntime="false"を設定するだけで良いのだが、なんか腑に落ちない。
どうせならデフォルトをincludeantruntime="false"に変更して欲しかった。
それならbuild.xmlのクラスパス設定に問題がある人だけがエラーになり、以前から正しくクラスパスを設定している人は何も変更しなくて良いのに…
いってることはごもっともと思うが、warningがでるのもきになるので、
おれおれbuild.xmlテンプレートファイルを修正しておいた。
https://github.com/tanarky/sample-codes/blob/master/java/build.xml.template


Graphvizでコマンドラインから画像を生成してみる

Graphvizを使って、コマンドラインから画像を作成してみた。

インストール:
sudo aptitude install graphviz

サンプルコード:
https://github.com/tanarky/sample-codes/blob/master/dot/test_japanese.dot

実行結果:
/home/satoshi/github/sample-codes/dot% cat test_japanese.dot 
digraph test_png {
  node [fontname="/usr/share/fonts/truetype/ttf-japanese-gothic.ttf"];
  hoge -> piyo -> hoge -> hoge;
  hoge -> fuga;
  piyo -> fuga;
  hoge [label = "テスト"];
}
/home/satoshi/github/sample-codes/dot% dot -Tjpg test_japanese.dot -o /tmp/test_japanese.jpg
/home/satoshi/github/sample-codes/dot% dot -Tpng test_japanese.dot -o /tmp/test_japanese.png

作成された画像(jpg):
作成された画像(png):
utf8で設定ファイルを書けば、日本語名も出力できることを確認。
もうちょっとオプションについて調べて、使っていこうと思う。

Ubuntu 10.10 Netbook on Thinkpad x100e のTouchpad設定

Thinkpad x100eにUbuntu 10.10 Netbookをインストールして使ってるんですが、
センタースクロールを有効にするために、

参考:
Ubuntu 10.10 on ThinkPad x100e でセンタースクロールを有効にする - RX-7乗りの適当な日々

インストール

$ sudo apt-get install gpointing-device-settings
以上!
してるわけですが、
いつのまにか、Segmentation faultで設定画面が起動しないことに気が付きました。

というわけで、ぐぐった結果、以下のページを発見
[ubuntu] gpointing-device-settings Segmentation Fault - Ubuntu Forums

要は、バージョンをあげろ、っていうことなので、ダウンロードして
インストールしました。
Debian -- パッケージのダウンロードに関する選択 -- gpointing-device-settings_1.5.1-3_i386.deb

ただ、バージョンをあげても、touchpadを無効にしようとしても、
できませんでした。あきらめて、ONで使ってます。

MySQL: load data infile ではまった(local指定) @ Ubuntu

いつもは、以下のようにload dataしている。
mysql> truncate table inttest;
Query OK, 0 rows affected (0.00 sec)

mysql> desc inttest;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id1   | int(10) unsigned | NO   |     | NULL    |       |
| id2   | int(10) unsigned | NO   |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> load data infile '/tmp/test.tsv' into table inttest;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from inttest;
+-----+-----+
| id1 | id2 |
+-----+-----+
|   1 |  10 |
|   2 |  20 |
+-----+-----+
2 rows in set (0.00 sec)

上のコマンドは、Mac上のMySQL(macports mysql5 @5.1.53)で実行したのですが、
これをUbuntuのMySQL(バージョン: 5.1.49-1ubuntu8.1)で実行すると
エラーになるので、原因を調査。
mysql> load data infile '/tmp/test.tsv' into table inttest;
ERROR 29 (HY000): File '/tmp/test.tsv' not found (Errcode: 13)

というエラーになります。 FILE権限ないのかと思ったけど、
rootでもエラーになるのでほとほと困ってましたが、ようやく原因が判明。

Bug #244406 in mysql-dfsg-5.0 (Ubuntu): “ File load data infile'file-name' fails”
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.5 LOAD DATA INFILE 構文

mysql> load data LOCAL infile '/tmp/test.tsv' into table inttest;
Query OK, 2 rows affected (0.06 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

LOCALをつけなさい、ってことですが、必須パラメータなんすかね。
LOCAL以外のファイルを読みたい要望は個人的にはないので、
これからはLOCALをちゃんと指定しようと思う。


Perl: テンプレートエンジン Tenjin を試してみる

Perlでのテンプレートエンジンを探していて、
Tenjinというものを見つけたので
早速使ってみた。

参考:
[perl] TTより5倍速い?テンプレートエンジン"Tenjin"を試す - ありんく tech-log

サンプルコード:
https://github.com/tanarky/sample-codes/tree/master/perl/tenjin

実行してみた結果が以下の通り。
/home/satoshi/github/sample-codes/perl/tenjin% perl engine.pl 
<h1>タイトル</h1>
<ul>
 <li><a href="http://www.yahoo.co.jp">ヤフー</a></li>
 <li><a href="http://mixi.jp">mixi</a></li>
 <li><a href="http://www.dmm.co.jp">DMM.com</a></li>
</ul>
/home/satoshi/github/sample-codes/perl/tenjin% ls
engine.pl  sample.pl.html  sample.pl.html.cache
/home/satoshi/github/sample-codes/perl/tenjin% cat sample.pl.html.cache 
my $_buf = ""; my $_V;  $_buf .= q`<h1>` . escape_xml($title) . q`</h1>
<ul>
`; foreach my $e (@$entries) {
 $_buf .= q` <li><a href="` . ($e->{url}) . q`">` . escape_xml($e->{name}) . q`</a></li>
`; }
 $_buf .= q`</ul>
`;  $_buf;

実行すると、「テンプレートファイル名.cache」というファイルができる。
中身を見てみると、テキストファイルで、perlのコードになっている。
ちゃんと中身は読んでないけど、テンプレートからperl code generateしているっぽい。

速度は早いのと、CPANからインストールできるので、
ちょっと使ってみようと思う。

MySQL: bit shiftして値を抽出

以下のような3つのテーブルがあったとする。

mysql> select * from people;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | 石川遼       |
|  2 | 斎藤佑樹     |
+----+--------------+
2 rows in set (0.00 sec)

mysql> select * from spec_keys;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | 身長      |
|  2 | 誕生年    |
+----+-----------+
2 rows in set (0.00 sec)

mysql> select * from specs;
+-----------+---------+---------+
| person_id | key_int | val_int |
+-----------+---------+---------+
|         2 |       1 |     176 |
|         2 |       2 |    1988 |
|         1 |       1 |     175 |
|         1 |       2 |    1991 |
+-----------+---------+---------+
4 rows in set (0.00 sec)

specとは、人物の付随情報を表すことを目的としたテーブルで、
普通のrelationalテーブルで、石川遼が1991年生まれ、
といったことがわかるようにしている。

データを抽出するときにちょっと細工をして、
以下のようにbit shiftとbit演算をして抽出してみる。
mysql> select person_id, key_int << 16 | val_int from specs;
+-----------+-------------------------+
| person_id | key_int << 16 | val_int |
+-----------+-------------------------+
|         2 |                   65712 |
|         2 |                  133060 |
|         1 |                   65711 |
|         1 |                  133063 |
+-----------+-------------------------+
4 rows in set (0.00 sec)

これにより、一見してどういうデータかわからなくなるが、
spec_keyとspec_valueのフィールドを1つにまとめることができ、
また、valueがintであるので、後々、範囲でも調べることができる。

制約としては、valueが16bit(65536)を超えない値であることや、
key数にも上限値が下がる。

こんなことをして、何がしたいかはまた別で書く。



MySQL: concatで文字列連結してselect

例えば、商品IDのような一意なコードがあったとして、
そのコードが、`type`と`name`を "-"(ハイフン) でつないだ文字列だとする。

MySQLには`type`と`name`でUnique KEYに設定しているテーブルに格納し、
抽出したい時には、商品IDとしてとりだしたい、という要望があったので、調査。

結論としては、以下のように、concatを使った。

mysql> show create table test1 \G
*************************** 1. row ***************************
       Table: test1
Create Table: CREATE TABLE `test1` (
  `type` int(11) NOT NULL,
  `name` char(32) NOT NULL,
  KEY `id` (`type`,`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> select * from test1;
+------+-------+
| type | name  |
+------+-------+
|    1 | name1 |
|    2 | name2 |
|    3 | name3 |
+------+-------+
3 rows in set (0.00 sec)

mysql> select concat(type, '-', name) from test2;
+-------------------------+
| concat(type, '-', name) |
+-------------------------+
| 1-name1                 |
| 1-name2                 |
| 1-name2                 |
+-------------------------+
3 rows in set (0.00 sec)

特に難しいことは何もないけど、自分用にメモ。