val mockedFile = mockk<File>()
every { mockedFile.write(any()) } returns Unit
val mockedFile = mockk<File>()
every { mockedFile.write(any()) } returns Unit
coEvery {
someClass getProperty "now"
} returns now
select * from table use index(index1,index2)
select * from table ignore index(index1)
select * from table force index(index1)
select * from join1 inner join join2 on join1.join1_id = join2.join1_id;
select * from join1 inner join join2 using(join1_id);
usingで同じ名の列は一つになり、列減少する
基本、usingの方が便利と思う。
キー以外の内容はkey-valueの配列かな
RDBと違う
配列の中身を取るに UNNEST関数を使う
NESTは階層で、UNNESTは階層をなくす、平準化にする
例えば。
epは配列で
select 他のカラム、ep.key, ep.value.string_value
from xxxx, UNNEST(配列のカラム) ep
以上は検索できるが、
問題は、配列中の値の複数を条件として検索できない
ep.a=a AND ep.b=b で取れない
で、それで別々に検索して、JIONなどのSQL技で解決。
複雑なSQLになる。
SELECT GENERATE_ARRAU(11,33,2) AS some
start,end,step(default 1)
+--------------------------------------------------+
| some |
+--------------------------------------------------+
| [11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33] |
+--------------------------------------------------+
GENERATE_ARRAU(1,10)
- record->split->node
- どこに保存されるはprimary keyで決める
- autoIncrementの仕組みがない、順番に保存するのは特定のnodeに集中するので、望ましくない(hotspot発生)
- autoIncrement以外のIDの生成方法
uuid 1~uuid4
- uuid1はtimestampペース、mac addressを使う
連番になる可能性
- uuid4はランダムの乱数で、分散性が高い、衝突になる可能性が0ではない
snowflake
ULID
timestampを使ってIDを生成する場合、どうしても分散率が低い。
なので、
shardId=hash(key)%N
PRIMARY KEY(shardId,分散率低い値のcolumn)
の複合キーで対応する
内部のHash関数を使う。
- farm_fingerprint
- など