MySQLでのテーブルコピーを考える
MySQLでテーブルコピー(同一インスタンス内とか別インスタンスとかあるけど)って意外とテストとかちょっとしたリカバリ作業用にしたくなりますよね。
というわけで、InnoDBとMyISAM関連だけですが書き出してみました。
コピーパターン
…
[さらに読む]TLDR;
MySQL 8.0.20 Release Note
Hash joins are now used any time a nested block loop would be employed. This means that hash …
[さらに読む]昨日はmrubyでMySQLのUDFを作ってみたんだけど、関数毎にCのプログラムを書くのがめんどくさいので、簡単なツールを作ってみた。
詳しくは README 参照。
fib.rb と fib.spec をこんな感じで作っておいて、
fib.rb
LONG_LONG_MAX = 9223372036854775807
def fib(n)
b = 1
c = 0
n.times do
a, b = b, c
c = a + b
raise 'Overflow' if c > LONG_LONG_MAX
end
c
end
fib.spec
MrubyUdf.function do |f|
f.name = 'fib' # 関数名は fib
f.return_type = Integer # 戻り値は Integer
f.arguments = [ # 引数は一つで型は Integer
Integer
]
end
% mrubyudf fib.spec
とやれば fib.so が出来上がるはず。 …
[さらに読む]MySQL では @ で始まるユーザ定義変数を使うことができます。
mysql> SET @v1=123, @s1="ABC"; Query OK, 0 rows affected (0.00 sec)
こんなふうに定義すると、SELECTなどで使うことができます。
ここで、上で定義した2つの変数と、未定義の変数をSELECT文で見てみると:
mysql> SELECT @v1, @s1, @t1; +------+------+------------+ | @v1 | @s1 | @t1 | +------+------+------------+ | 123 | ABC | 0x | +------+------+------------+
上で値をセットした v1, s1 は、それぞれセットしたとおりの値が表示されていますが、未定義の @t1 には "0x" と表示されてしまいました。
値が NULL だとそうなるのか?
mysql> SET @s1=NULL; mysql> SELECT @v1, @s1, @t1; …[さらに読む]
Twitterに書き殴ったのですが、流れてしまうので、一応こちらにもまとめておこうかと。
これって、何を数えているんでしたっけ?
mysql> SELECT COUNT(*);
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
— 坂井 恵(SAKAI Kei) (@sakaik) 2020年5月1日
コトの発端はちょっとした打ち間違いだったのですが、MySQL は FROM 書かなくても演算できます。こんな感じ。
mysql> SELECT 3; +---+ | 3 | +---+ | 3 | +---+ mysql> SELECT SQRT(64); +----------+ | SQRT(64) | …[さらに読む]
昨日はCでMySQLのUDFを作ってみたんだけど、今日はRubyで作ってみる。Rubyと言ってもmrubyだけど。
mrubyは5年ぶりくらいに使ってみたんだけど、相変わらずドキュメントが少なくてなかなかつらい…。
まず mruby のビルド。MySQLのUDFは共有ライブラリにしないといけないので、パッチをあてて make。
% git clone git@github.com:mruby/mruby.git % cd mruby % patch -p1 < /path/to/mruby-shared.patch % make
mruby-shared.patch はこれ
diff --git a/build_config.rb b/build_config.rb
index 254a28ce..310191e3 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -35,6 +35,10 @@ MRuby::Build.new do |conf|
# cc.compile_options = %Q[%{flags} -MMD -o "%{outfile}" -c "%{infile}"]
# end
+ conf.cc do |cc|
+ cc.flags = '-fPIC'
+ end
+
# mrbc …[さらに読む]
MySQLのユーザー定義関数(UDF)は大昔に作った記憶があるけど、最近作ってなかったので試しに作ってみたメモ。
関数の中身はなんでも良かったんだけど、フィボナッチ数を求める fib()を作ってみた。
ちゃんと知りたい場合は、マニュアルとかサンプルプログラムを見ましょう。
% gcc -shared -I /usr/local/mysql/include fib.c -o fib.so % sudo cp fib.so /usr/local/mysql/lib/plugin/ % /usr/local/mysql/bin/mysql -uroot mysql> create function fib returns integer soname 'fib.so'; Query OK, 0 rows affected (0.02 sec) mysql> select n, fib(n) from (values row(1),row(2),row(3),row(4),row(5),row(6),row(7),row(8),row(9),row(10)) as n(n); +----+--------+ | n …[さらに読む]
sakaikさんのブログで今月の日付一覧を得るクエリを読んでいて、ここで紹介されているクエリが手元で実行できなかったので、メモ。
原因は手元の環境が8.0.17でVALUES()関数がなかったことが原因。
よく見るとvalues()関数でテーブルを作って、それを自己結合しつつ出力を作ってソートしている。
再帰CTEでシーケンスが作れるので、それを使っても良いかもなと思い、復習がてら書いてみました。
with recursive rec(V, D) as ( select 1, cast(date_format(@dt, '%Y-%m-01') as date) union all select V+1, date_add(D, interval +1 day) from rec where D < last_day(@dt) ) select D as `DATE` from rec; …[さらに読む]