緯度経度の数字で絞るのと緯度経度の範囲(POLYGON)で絞るのとは違う

先日の shunyasu さんのトークをきっかけに、以下の日記を書きました。

sakaik.hateblo.jp

この中で、私が

> GeoHashも結局緯度経度で絞り込んでいることを考えると、すべてのクエリで同じ件数が得られるべきと考えるのが自然

と書いたのですが、これは誤りでした。
その後の shunyasuさんとの Twitter(X)でのやりとりの中で発覚しました。

両者の違い

 単純に緯度経度の数字の範囲に収まっているものを抽出するのと、その緯度経度の各点を頂点としたポリゴンの中に含まれるものを抽出するのは、一見すると同じことのように思えます。
ポリゴンだって、その緯度と経度の範囲を検索するわけですからね。
しかし、ポリゴンのある2つの頂点を結ぶ点がどこを通るのかを考えてみると、実は違うことに気づきます。

 学生の頃などに、メルカトル図法の地図を見ながら、「東京とサンフランシスコ(あるいはNYだったりパリだったり)の飛行機は、こんなに "遠回り"をしている(実はそれが最短距離)」という話を聞いたことがあると思います。今回の話題は、まさにそれでした。 もう一度書くのも面倒なので、以下のツイートを参照してください。



ということで試してみた

 下図のような、(35 135)-(36 136) の四角形のポリゴンを考え、検索手法によりPOINTが内部に含まれるかどうかを判定したいと思います。


 ここでは下辺(35N で 135E から 136E を結ぶ辺)に注目して実験することにします。北緯35度を跨ぐ点をいくつか登録します。

CREATE TABLE points (p POINT SRID 4326);

INSERT INTO points VALUES (ST_GeomFromText('POINT(35.005 135.5)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(35.004 135.5)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(35.003 135.5)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(35.002 135.5)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(35.001 135.5)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(35 135.5)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(34.999999 135.5)',4326));

こんなデータが登録されます。

mysql> SELECT ST_AsText(p) FROM points;
+------------------------+
| ST_AsText(p)           |
+------------------------+
| POINT(35.005 135.5)    |
| POINT(35.004 135.5)    |
| POINT(35.003 135.5)    |
| POINT(35.002 135.5)    |
| POINT(35.001 135.5)    |
| POINT(35 135.5)        |
| POINT(34.999999 135.5) |
+------------------------+
7 rows in set (0.000 sec)
緯度経度の数値で絞り込む

 まず、単純に緯度経度の数値の大小で絞り込むクエリを確認してみましょう。

mysql> SELECT ST_AsText(p) FROM points
    ->  WHERE ST_Latitude(p) BETWEEN 35 AND 36
    ->    AND ST_Longitude(p) BETWEEN 135 AND 136;
+---------------------+
| ST_AsText(p)        |
+---------------------+
| POINT(35.005 135.5) |
| POINT(35.004 135.5) |
| POINT(35.003 135.5) |
| POINT(35.002 135.5) |
| POINT(35.001 135.5) |
| POINT(35 135.5)     |
+---------------------+
6 rows in set (0.000 sec)

 期待通り、北緯35度線よりも北にある点がすべて選択されました("BETWEEN" なので境界線上の点も含まれています)。

ポリゴンによる絞り込み

 次に同じ範囲(のつもり)のポリゴンを作成して絞り込んでみます。

mysql> SELECT ST_AsText(p) FROM points 
    -> WHERE ST_WITHIN(p, ST_GeomFromText('POLYGON((35 135, 36 135, 36 136, 35 136, 35 135))',4326));
+---------------------+
| ST_AsText(p)        |
+---------------------+
| POINT(35.005 135.5) |
| POINT(35.004 135.5) |
| POINT(35.003 135.5) |
| POINT(35.002 135.5) |
+---------------------+
4 rows in set (0.000 sec)

 おや!?(←わざとらしい) 北緯35度、北緯35.001度の点が含まれなくなってしまいました。
これは地球上で 135Eと136Eを結ぶ「直線」は、その中間点(135.5E)に於いて 35.001Nと35.002Nの間を通っていることを意味します。
この狭い範囲でさえ、見事に西海岸行きの飛行機を再現できました。

まとめ

 メルカトル図法に飼い慣らされてしまった我々にとって、このST_WITHIN()の結果は直感に反するかもしれません。これが地理座標における「正しい範囲」と言えます。
一方、緯度経度の範囲で切り出したいというのは、タイル的な切り出しを行いたいという意図であることも多いと思います。このような時に地理座標を使う(=ポリゴンで抽出)してしまうと、今回の例の「35度以上の範囲を切り出したつもりなのに 35.001度が含まれない」といったことが起こります。この場合、単純に緯度経度の数字だけで絞り込むほうが、目的に合致したデータが取得できるかもしれません。
どこまで正確性が要求されるのか、切り出したい目的は何なのかなど、こんな簡単な「四角形の範囲を切り出す」という処理ひとつとっても、考えることがたくさんあるのですね。

追記:PostGISでは挙動が異なる

 PostGISでは、このエントリで書いたMySQLでの挙動とは異なる結果を返しました。

  • テーブルとデータ作成(緯度経度がMySQLとは逆であることに注意)
CREATE TABLE points (p GEOMETRY(POINT, 4326));

INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 35.005)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 35.004)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 35.003)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 35.002)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 35.001)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 35)',4326));
INSERT INTO points VALUES (ST_GeomFromText('POINT(135.5 34.9999)',4326));
  • 数値範囲での検索。当然、MySQLと同じ結果。
test=#  SELECT ST_AsText(p) FROM points
  WHERE ST_Y(p) BETWEEN 35 AND 36
    AND ST_X(p) BETWEEN 135 AND 136;
      st_astext      
---------------------
 POINT(135.5 35.005)
 POINT(135.5 35.004)
 POINT(135.5 35.003)
 POINT(135.5 35.002)
 POINT(135.5 35.001)
 POINT(135.5 35)
  • Polygonに内包する点の判定。MySQLには含まれなかった 35.001 が含まれている。35ジャストが含まれないのは、おそらく線上の点はWITHINではないのだろう。
test=# SELECT ST_AsText(p) FROM points 
  WHERE ST_WITHIN(p, ST_GeomFromText('POLYGON((135 35, 135 36, 136 36 ,136  35 , 135  35))',4326));
      st_astext      
---------------------
 POINT(135.5 35.005)
 POINT(135.5 35.004)
 POINT(135.5 35.003)
 POINT(135.5 35.002)
 POINT(135.5 35.001)

 この挙動について井口さんからコメントをいただきました(実際には順序が逆で、このコメントをいただいたから上記追加検証をしたのですが)。

 PostGISでは GeometryとGeographyを明確に区別していて(だから距離が度で返るといった「変なこと」が起きる)、今回のもGEOMETRYとしてつまり平面として扱っているのでメルカトル的(笑)挙動になっているとのこと。

はっ????  テーブル定義 Geometryで作ってるせい???? やりなおしですな、これは。

MySQLに新たなGIS(Spatial)関数 ST_Perimeter()を実装する

MySQLには (特にPostGISと比べて) 対応している空間関数がとても少ない」と、この7年間言い続けてきました。
一方で、MySQL 8.0 以降(正確には5.7以降)のGIS関数は Boost::Geometryという専門家のようなライブラリを活用して、独自実装を避けるようになった、ということもお伝えし続けてきました。

・・・この2つの情報を組み合わせると、
「 Boost::Geometryライブラリの関数を呼び出すコードを書けば、MySQLにもどんどんGIS関数を追加できるのではないか」
という必然に行き着きます。

・・・これに気づくまでに7年かかった。。。


ということで、Polygonの周長を返す ST_Perimeter() 関数を実装してみました。
Spatial機能に関する背景情報や実装のお話などは、先日のMyNA望年LT大会で結構言い尽くしたので、発表資料をここに上げておきます。ご参照ください。

speakerdeck.com


 実装の方法は、「まねっこ作戦」です。実装済の似たような関数を探して、自分が実装したい関数との差異を把握し、活かせるところを活かし異なるところは修正したり実装したりするという流れです。今回 ST_Perimeter()関数をターゲットにしたのは、

  • Polygonのみに対応している関数である(pointやlinestringが渡されたらエラーにするだけなのでシンプル)
  • 戻り型も「長さ」というわかりやすい1つの数値を返すだけである

といったシンプルな関数であるからです。まずこのやりかたで動くものが作れるのか、という「おためし」みたいなものですね。

 当初、まねっこの参照元にした関数が測地系に対応していない関数で、実装してみたら一見ちゃんと動いたように見えたものの(デカルト座標)、測地系を指定したらエラーになってしまいました。改めて ST_Area() という、まさに「ポリゴンを受け取って数値を返す」というピッタリの関数を見つけ出し、今回の実装に到ったのでありました。
 Boostに頼りっきりの関数、測地系に対応していない関数、MySQL側で結構たくさん処理をする必要がある関数、などなど色々な実装が混在しているのだなぁと、ソースコードを見て思いました。



 実装方法はわかったので、全ての関数をこのようなシンプルな方法で作れるとは思いませんが、できる関数はどんどん増やしていけたらいいなぁと考えています。

MySQL本家にもコントリビュート出してみました。Affects me (Impact on me) ボタンを押していただけると、中の人の注目度も少し上がって受け入れてもらいやすいかもしれないので、よかったらよろしくお願いします。(スライドにも書いた通り色々タイミングが悪いようで、なかなか受け入れてもらえそうな気配を感じることができていません。。。)
bugs.mysql.com






※本記事はRDBMS-GIS(地理情報・位置情報) Advent Calendar 2025の23日目の記事としても登録しました
qiita.com
※本記事はMySQL Advent Calendar 2025の2枚目23日目の記事としても登録しました
qiita.com

MySQLのspatial indexは遅いのか?

先日参加した「MyNA(日本MySQLユーザ会) 望年LT大会2025@新宿」にて、(要約すると)「Spatial Indexなんかよりも緯度経度で検索したほうが、ずっと速いよ!」という発表を聞かせていただきました。

speakerdeck.com

MySQLのSpatial Indexは遅いのか?

 今回設定されたケースでは、「緯度経度での検索」が最速なのは、言われてみれば納得感はあります。何と言ったって、緯度と経度の数字の大小関係だけで対象エリアが特定できるのだから、余計なことをしない(プリミティブな数値型だけで評価できる)方法が最速になるんじゃないかな。
・・・・という仮説を、会場でもお話させていただきました。
 

空間インデックスが効果的に使えるのは、(今回のトライを活かすとすると)こんな形とか、あるいはもっと複雑なポリゴンとか、範囲(中心点からの距離)とかの時なのかなぁと思いました。

GeoHashの計測について

 GeoHashを使ったSQLを見てみると、結局 lat/lon の最大最小を使って絞り込んでいることに気づきました。これ、geohash列が条件に加わった分、緯度経度の絞り込みと比べて無駄な処理をするだけなのではないでしょうか。
 GeoHashというのは「隣接」の概念には非常に弱くて、範囲の絞り込みにもあまり適切でない仕組みだと理解しています。例えば下図の黒枠線のような範囲が対象となる場合、左下GeoHash値は xn774cet(略して Xcetとします)、右上は xn774cu6(同 Xcu6)となります。 Between 'Xcet' AND 'Xcu6' には 'Xc[f-u][.]' の範囲が含まれていますから、この図で言うと黒い枠線内のみでなく Xcs. に相当する「s」の全領域も対象に含まれてしまい、あまり効果的に絞り込めているとは言えないですよね(本当に大きな範囲から、無駄を承知で少しでも絞り込みを、、、という時に生きてくる可能性はあると思いますが)。
(ちょっとわかりにくい説明だったので補足すると、左下Xcet は正しいけれども、その上にあるXcgなんとか、をはじめとして、Xchなんとか、Xciなんとか、、といった全然関係ないエリアにもマッチしているということです)


 一方で、「GeoHashに24桁も要るのか問題」というのはあり、この桁数がパフォーマンスに影響を与えている可能性があるのでは、とも思いました。

p0のpointについて

 会場にて「すべてのクエリの結果が完全には一致しなかった」という話を聞かせていただいて考えていたのですが、 p0 列はオリジナルの緯度経度値を必ずしも保存できていませんね。GeoHashに24桁も使っているので現実的には元の値に戻る気もしますが、値の維持には、単に元の4326の値を ST_SRID()でデカルトにするのが確実かと思います。
GeoHashも結局緯度経度で絞り込んでいることを考えると、すべてのクエリで同じ件数が得られるべきと考えるのが自然かなぁ、、と思いました。

ST_GeomFromText()のオーバヘッド?

 クエリをよく見てみると、lat/lon の時は数字をそのままクエリに供しているのに対して、GeoHashもSpatial Indexも、ST_GeomFromText()やST_Geohash()関数で都度変換処理を行っていますね。これらの関数が著しく遅いものだとは思っていませんが、もしかすると大量に処理したときにはこの関数のオーバヘッドが蓄積されたものが差に表れているのでは? とも思いました。

嬉しい!

 以上、情報を聞かせていただき、そして資料を拝見して、気になったポイントを整理してみました。筋違いのことを書いている可能性もありますが、一つでも参考になる部分があれば幸いです。MySQLの空間情報についてこのような発表してくれる人が出てきたことをとても嬉しく思いました。shunyasuさん、これからもよろしくお願いします!!



※この記事は RDBMS-GIS(地理情報・位置情報) Advent Calendar 2025 の(便宜上)21日目の記事として参加しています
qiita.com

日本MySQLユーザ会望年LT大会2025を開催しました

2025年12月19日、「MyNA(日本MySQLユーザ会) 望年LT大会2025@新宿」を開催しました。
mysql.connpass.com

6年ぶりのオフライン開催

 コロナ期間に2回ほどオンラインで開催したことはありましたが、オフラインでの開催は、赤坂のお店を借り切って実施した2019年以来の6年ぶり。さくらインターネットさんに会場提供いただいき、開催することができました。どうもありがとうございます。
 単に情報伝達をするだけならば、オンラインのイベントは非常に有効なのですが、ユーザー会としてはやはり「交流」という部分を大切にしていきたい。そんな思いでのオフライン開催です。

申込み、伸び悩む

 一応イベント企画をするからには、大体何人ぐらいに来てほしいといったイベント設計はしています。コロナ以降、私も含めて出不精になったという傾向と、オンライン会議の影響で「直前行動?」の習慣が身についてしまったのか、想定よりも参加者申し込みが伸び悩んでいて、ずいぶん気をもみました。蓋を開けてみればほぼ想定通りの規模で賑やかに開催できました。開催前日の申込者数が、イベント公開直後1日目スタートダッシュな申込者数と同じ数って、どうなの(笑)。
 ご都合が見えないなどの事情もあるかと思いますが、参加できそうというタイミングで早めにお表明いただけると大変助かります。

おおまかな段取り

 会場到着して受付を済ませた人から「ウェルカムドリンク」として飲み始めていていいよ、という緩いスタート。定刻19時に乾杯をしてからしばらく(30分程度)ご歓談タイムとおなかに食べ物を入れるタイムにした後、LT大会開始という流れでした。
 「日本MySQLユーザ会会」という名前でグリーさんに会場いただいて開催していた第1回(もう何年前になるんですかね)から、この「飲みながらスゴい話を聞く」「興味ない人は聞きたい人の邪魔にならない配慮だけしてもらったら後のほうで喋ってて構わない」というスタイルでイベントを開催しています(懐かしいな。。特にいちいさんに大変大変お世話になりました。見てるかな...)。
 当時は企業もOSSのイベントを積極的に開催しはじめた時期で、「手弁当で実施するユーザー会としては、企業にはできないことをやってやろう。まさかお酒飲みながら勉強会やるなんて企業の看板背負ってできないだろう」みたいで企画したように記憶しています。今は飲食的企業イベントもずいぶん増えましたよね。

LT大会!

 LTには12人の方が登壇してくださいました。参加24人のうちの半分が「話をする側」になってくれて、まさにこんなイベントをやりたかったんだよ!!!と嬉しくなりました。LTをしてくださった皆さん、ありがとうございました。
 LTは一応持ち時間5分ではあるのですが、厳格な運用はせず、(一応時間を計っていたので)大幅に超えた時だけ現在の時間をお伝えするといった「ゆるゆるLT」として実施しました。「(邪魔にならなければ)聞かないでお喋りしていていいよ」というレギュレーションにもかかわらず、みんなじっくりと聞いていました。聞くときに座れるようにと椅子も用意していたのですが、あまり使われずにみんな立って聞いていましたね(笑)。
 会場のほうに気が行っていたので、全てのLTを集中しては聞けなかったのですが、個人的にはMySQLのGIS話を聞けたのが、すごく嬉しかったです。GISに関して私は機能のほうを中心に見ていて、あまりパフォーマンスを追ったことがなかったので(そういう案件があればお手伝いというか一緒に調査していきたいので、お声がけください!)、こういったほうも今後見ていかないとなぁと感じました。本件もう少し書きたいことがあるので、別エントリにて。
 発表資料の一部は、本エントリ冒頭にあるconnpassリンク先からも辿れます。

改めて御礼

 時間いっぱいまでLTで「ウェルカムドリンク」から合わせると3時間以上、大変に楽しい空間でした。30人くらいまでだと今のスペース、それを超えるとついたてを外して広くしたいかも、というくらいの感じですかね。 さくらインターネット様、会場を提供していただき、また、遅れてくる人のためにオートロックの門番をするなど、何から何までご配慮をいただき、どうもありがとうございました!
 

なぜ「望年」?

 日本MySQLユーザ会のイベントには「日本MySQLユーザ会会」など、ちょっと変わった名前のものがあります。今回のイベントも「忘年会」ではなく「望年会」。今年1年を振り返るだけでなく、来年以降の「この先」に繋げたいという思いで、このように呼んでいます。
 もちろん私のオリジナルの命名ではありません。私がこの言葉に初めて触れたのは1990年代前半、当時参加していたNIFTY Serveの音楽系フォーラムで年末に参加していたイベントが、この名前だったのでした。感性は人それぞれなので、通じる人と通じない人がいるかと思いますが、私はこのネーミングに含まれる「来る年への希望」といった雰囲気に感心し、以来、ときどき使わせてもらっています。

今後

 このようなイベントを開催するのはなかなか手間がかかるので「今回で最後にしようかな」などと思うことも、実は多いのですが、実際開催してみると、昔からコミュニティに参加してくれている人、初めて来る人などたくさんの人が来てくれて、「なにかが生まれそう」な空気と熱気を感じて、やっぱり開催してよかったなぁと思うのであります。参加されたみなさん、ありがとうございました。
 随分とミニマルに企画しているイベントですが、それでも開催は色々大変です。更に手間を減らす工夫をして、今後もまたこのような交流+情報交換できる機会を作っていきたいので、ぜひまた参加してくれたら嬉しいです(早めの参加表明、お友達を誘うなど広報へのご協力、発表登壇、当日などのお手伝いなどなどあれば喜びます)。

 それでは皆さん、良いお年をお迎えください!

 

オープンソースカンファレンス2025沖縄参加

 2025年11月29日(土)に沖縄・那覇市で開催された、オープンソースカンファレンス2025沖縄(OSC 2025 Okinawa)に参加してきました。
ospn.connpass.com

6年ぶりの沖縄開催

 2019年の開催以来6年ぶりの沖縄開催です。私は2017年が最後なので、実に8年ぶりの沖縄訪問。 OSCは様々な地域で開催されてきましたが、ずっと続いている地域もあれば、残念ながら開催が止まってしまった地域もあります。 沖縄では今回、さくらインターネットさんが会場提供してくださったことにより、久々の開催が実現しました。

OSC Okinawaの20年

 今回のOSCは、普段と少し異なり、以下のようなテーマが設定されていました。

今年のOSC沖縄では、今後のOSCとOSPNの方向性を皆さんで考え、認識を共有化出来たらと考えています。
現地参加だけでなく、オンラインでも皆さんのご参加をお待ちしています。

 いわば数年前に一度開催された OSCサミットのような 雰囲気で、全国各地のOSC メンバーたちが集まり、各地のたくさんの話をしてくれました。

私もひと枠発表

 今回私も日本MySQLユーザ会として、1枠発表の時間をいただきました。ワントラックで、発表者も多いので10分程度の持ち時間でしたが、 今回のコンセプトに倣い、主に20年間OSCに参加させてもらってきた中で思い出に残ったことや学ばせてもらったことなどについてお話をしました。 MySQLについては大切な事に絞ったので実質この1枚のみ。 春になるともう次のLTSが出るんですよね。

 「場を作る」ということに関して、失敗事例も含めて、OSCでは多くのことを学ばせていただきました。

ブースはまったり

 一応ブースの出展もしていました。今回は基本的にハンドキャリーだったので、展示品はほぼなし。 むしろブースとか関係なく、会場内でMySQLについて尋ねられればお話をし、私自身も他のブースでいろいろなことを教えてもらってという感でした。

交流会と懇親会

 夕方からは、まず会場内で交流会、そしてお店に移動して懇親会が開催されました。 セミナーの中で「畑違いなのですが」と言いながら蟻の研究の話をされた方がいて、 あまりに面白かったので、交流会で更にたくさんのお話を聞かせてもらいました。オープンソースでもないし、なんならITですらないのですが、仮説・検証を重ねて真実を追求する姿勢に心を打たれました。 半倍数性の話からコロニーの形成、いわゆる女王蟻の役割など聞いても聞いても尽きない話にわくわくさせられました。学部生さんとは思えない詳しさと落ち着きっぷりに、なんだか NHKの「沼ハマ」に出てくる人たちってこんな感じなんだろうなぁなどと妄想しました(出ていないそうです)。

久々の沖縄も楽しみました

 このエントリーでは、OSC本体のことだけを書きましたが、前後日程もできる限り、沖縄を堪能しました。 ソーキそばを食べ、延伸したモノレールの終点まで様子を見に行き、ステーキを食べ、オリオンビールをいただき、首里城を見学したり、南部をドライブしたり、三角点や基準点を見たり。 この点のことはまた別途noteに書こうと思います

まとめ

 年内最後のOSCとなる予定のOSC沖縄。普段はなかなかまとめて会うことがない方が全国から集まってくださったり、ここでしか会えない方とお話をさせていただいたりなど、大変充実したイベントでした。 11月は4回ある週末のうち3回が遠隔地でのイベント参加だったので、ちょっと体力空っぽ状態です。 たくさんのことを教えてもらって、まだ脳みそがパンクしていますが、少しずつ自分の中で整理していこうと思います。運営をされた皆様、イベントでお話をさせていただいた皆様、どうもありがとうございました。

MySQLのGIS機能2025

 このエントリは、RDBMS-GIS(地理情報・位置情報) Advent Calendar 2025 の1日目です。「RDBMS-GIS Advent Calendar」では今年も参加者を熱烈募集中です。RDBMSを中心としたなんらかのデータベース管理システムで地理情報データを扱ってみた体験やノウハウなどでお気楽に参加ください。今年は、アドベントカレンダーの期間中に書いたものだけでなく、2025年中に書いたブログなどでの参加もOKとしています。

 さて、2025年もMySQLのSpatial機能(GIS機能)は少しずつですが進化しています。現在のMySQLはLTSとInnovation Releaseという2本立てでリリースされていますが、基本的にLTSの方には新機能は加わらないので、このエントリーではInnovation Releaseのみ対象とします。(不具合の修正は、Innovation Releaseと同様の修正が MySQL 8.4 LTS にも加えられています)

2025年のMySQL Innovation Release (ver. 9.x)一覧

 MySQLのリリースは3ヶ月に1回。2025年もこのスケジュールに従って、4回のリリースが行われました。リリースされた Innovation Release のリリース番号は以下の通りです。

各バージョンで為されたSpatial(GIS)関連の修正

 2025年のMySQL Spatial機能の変更は、MBRに関するインデックスが壊れてしまう事象が直されたものが中心と言ってよさそう。それ以外では、9.4で加わったJSON関連機能でSpatial関連情報が正しく渡らないことが9.5で修正されたのがあるくらい。


MySQL 9.2.0
  • CREATE_SPATIAL_REFERENCE_SYSTEM が追加された
    • 今までは super 権限により実施可能だった以下のSQL命令が、この権限によりコントロールされます(superも継続だが非推奨に)
      • CREATE SPATIAL REFERENCE SYSTEM
      • CREATE OR REPLACE SPATIAL REFERENCE SYSTEM
      • DROP SPATIAL REFERENCE SYSTEM
  • MBRに影響ある更新と削除が絡んだ処理により、空間インデックスが壊れる事象があったのを修正。壊れたインデックスは新バージョンへのアップデートで自動で直らないので、いったん空間インデックスを削除して作り直すことを推奨。
  • auto_incrementと空間インデックスの両方を含むテーブルで INPLACEアルゴリズムでのALTER TABLE を実施すると、壊れることがあったのを修正。新しいレコードを用意している間に「空間インデックス内の」auto-increment情報が上書きされるために起きていた現象とのことですが、そもそも空間 インデックスの中にauto-incrementの情報なんて持っていたんだというところから(私は)理解が必要になりそうです。
MySQL 9.3.0
  • CHECK TABLE がクラスタドインデックスのジオメトリについて MBRの検証をしていなかった問題を修正
    • CHECK TABLE EXTENDED でクラスタドインデックスのレコードのMBRが正しいMBRと一致することを保証してくれるようになった
    • CHECK TABLE が空間インデックスの破損を誤って報告することがあったのを修正
MySQL 9.4.0
  • 空間データ型カラムのインデックス作成に関連する問題を修正、とだけアナウンス。詳細不明
MySQL 9.5.0
  • 暗黙的なGeoJSON表現に CRS URN を含めるようになった。常に含めるようになったということで、ST_AsGeoJSONの出力などでも(今まででも出力されていたと思いますが)、SRID=0 の場合でも確実に出力されるようになったとのこと。

この修正、よく分からないのでもう少し調べてみると「暗黙的なGeoJSON表現」というのが、MySQL 9.4.0で導入された「JSON dulality view」というもので発生し、その際にSRSが確実に渡されるように今回修正されたということまでは分かった。
MySQL :: MySQL 9.4 Reference Manual :: 15.1.17 CREATE JSON DUALITY VIEW Statement



さいごに

 LTSとInnovationにリリース体系が分かれたことを周知することに努めてきたこの2年近い期間ですが、そうこうしているうちに、あっという間に来年の4月には 次のLTSである MySQL 9.7 LTS シリーズがリリースされ、MySQL 10.x Innovation がはじまる見込みです。初めて2つのLTSが平行する記念すべき期間が始まります。そして 次の Innovation Releaseではどんな地理情報機能が加わるのか、半分期待、半分諦めで気長に楽しみにしたいと思います。
 Spatial機能に関して要望はいろいろあるけど、差し当たってわかりやすいところでは、MySQLへの入出力可能なデータフォーマットの拡充を期待したいところです。(ST_AsXXXX()系など)

YAPC::Fukuoka 2025 参加

2025年11月14,15日に福岡で開催された YAPC::Fukuoka 2025 に参加してきました。
yapcjapan.org

復活後3回目の参加

 今回の開催場所は福岡。YAPC復活開催後は、広島・函館に次いで3回目の参加になります。 日本全国で次々に開催していて、幹事の皆さんありがとうございます。 今回の会場は、博多駅から数駅行ったところにある福岡工業大学(福工大)でした。 このあたりは、福岡|九州 + 工業|産業|無印 の組み合わせの大学が沢山ありよく間違えてしまうのですが(本当は更にもう少しややこしい)、会場は福工大です。15年ほど前に、オープンソースカンファレンス(OSC)で利用させていただいたことがあります。

スポンサーしてました

 広島開催時の出来事への感謝の気持ちもあり、 函館に続いて今回も私の会社で微力ながらもスポンサーをやらせていただきました。 ARTRY(アートライ)ってやつです。

 私の会社では、既存のお客様などからの紹介によりお仕事のお話をいただくことが多く、特に宣伝することもないのですが、ブロンドスポンサーはチラシ1枚を配布させてもらえるということで、今回はせっかくなので何か面白いことを書いたチラシでも作って配らせてもらおうとも思っていた、、、、のですけど、結局準備する時間が取れず無念。「面白いこと」って意外と難しい。
 敢えて何か宣伝するとしたら「最近ちょっと力を持て余しているので、みなさん、社員の募集だけでなくパートナー会社とのご縁作りにも目を向けてみるといいんじゃないかな。いい人ここにいますよ」ぐらいです(要するに、お悩み事項があればお気軽にご相談、お声がけくださいということでよろしくお願いします。「課題」に関する話を聞かせてもらうだけでも楽しい)。

 残念だった点が一点。スポンサーは受付時に色々貰えないことは承知済みでしたが 、いざ会場に行ってみるとやっぱり 受付時のパンフ類は欲しかったなぁと感じました。ノベルティやバッグやTシャツはともかくとして、他のスポンサーさんたちがどんなチラシを配っているのかなどは興味あるので、スポンサーとして参加している人にも配ったほうが、情報を伝えたい側、情報を欲しい側双方にとって win だった気がします。

印象に残った話

 たくさんの講演者さんのとてもよく準備された濃厚な講演を楽しませていただきました。 あまりガツガツとメモを取りながら聴くという感じではなく、全体の雰囲気を楽しみました。その中で印象に残ったものをいくつか簡単に。

いなおさんの熱い思い

 ガッツリ技術系ではないしPerl要素も薄めだろうけど、開催前から一番楽しみにしていた講演でした。 雑誌(正確には定期刊行物)を作るために、どんなテーマを取り上げ、それを誰にどのように伝えてもらうかを決める過程での 発想やこだわり、思いなどを伺いました。 旬な話題を旬な著者に依頼し続けた積み重ねが、「YAPCの登壇者の半分は WEB+DB PRESSでできている」となったわけですね。新しいお仕事に移られてからの 考えや行動なども非常に魅力的なお話でした。 企画の際の「ビビってないか?」という問いかけは、slidoでの質問を見ても あまりよく伝わっていない人も多かったように感じましたが、私には「無用な遠慮をしていないか」「もっと踏み込めるのに、色んな理由をつけてやめちゃってないか」といった意味として、しっくりと来ました(この理解すら講演者の意図と異なるかもしれませんが、考えるためのよい刺激をいただいたのでヨシとしましょう)。
「ビビってないか?」、面白い表現ですね。

山澤先生の「AIを使う学生たち」

 今回の会場である福工大で学生を教えている先生の講演。ここ数年で、プログラミングの課題に対して学生がAIを使っている比率が急増しているという話を中心に、 教育現場の現状について伺いました。 教えていない名称がコメント欄に記述されていたり、学んだことがないであろうコードの技法が随所に見られたりなどを 数値化して、まさに「激増」である現状が紹介されました。 非常に悩ましい状況で、講演後にも知人らともディスカッションをして、色々思うところもあるので、改めて別のエントリーで書ければと考えています。
 学校教育や新人の教育という視点でのテーマでもあるのですが、一方でおそらく、長い経験を持つ我々のほうも、大きく意識を変えなければならないところに来ているのだろうなと感じました。

yoku0825さんのMySQL PITRのためのバックアップ

 立場上(?)もっとも楽しみにしていた講演のひとつ。ひたすらPITRのお話。バックアップの話というよりは、リストア(リカバリ)の話ですね。自分ではこのあたりの運用設計や設定をやったことがなかったのだけど、話を聞いたら手を動かしてみたいなという気分になりました。 XtraBackupは全然触ったことがなかったので、「PITRやるには(MySQL Enterpriseを除くと)これ一択」と聞けたのが良かったです。よし、やってみよう!(ここまで書いて、つい気になってAIさんと1時間ほどおしゃべりをしてしまった。。。リストアのためにprepare処理が必要であることから、リストア時にはバックアップファイルと同じサイズのストレージが必要だとAIが主張しているのだが、結構これは大事なのではなかろうか。。prepareしながらMySQLへのリストアを進める(ファイルには書かない)とかできれば良いのですが)

懇親会は2日目の夜

 前夜祭の帰り道で知人と話題にするまで私もずっと勘違いしていたのですが、懇親会の開催は1日目と2日目の間ではなく、2日目終了後だったのですね。 1日目の登壇者でも「今日の懇親会の前に」みたいなこと言ってる人がいて、やっぱり1日目終了後だと思うよねーと親近感を持ちました。
 懇親会は料理も豪華で、今回お店は訪問できなかったビアキチのビールも来てくれて、 大変盛り上がりました。 今回どちらかというと、旧交を温めたことが多く、新しい方に積極的に話しかけたりすることが少なめだったのですが、その中でも YAPCを支えるカメラマンさんとお話できたのは面白かったなー。今後ともイベントをよろしくお願いします!あと、Twitterで時々他人のリツイートから流れてきてお名前だけ存じ上げていた方とご挨拶できたのも良かった。

1日目の夜は水炊きへ

 時間を巻き戻して1日目の夜、懇親会があると思って何も考えていなかったのですが、少人数でいいから水炊きを食べたいなぁという気分になり(前夜祭の際に「もつ鍋より水炊き!」と現地の人にすり込まれたのがここで発現したらしい(笑))、夕方に博多駅近くのお店に電話して席を4つ予約。 知人らに加えて、YAPC会場で初めてお話しした方をお誘いして行きました。 ひとりだけ初めてだと居心地悪いかなと少し心配していたのですが、全く心配いらず、とても楽しい話題であっという間に時間が過ぎていきました。 コミュニティって素敵。ありがとうございました。

さくらインターネットさんの前夜祭

 さらに時間を巻き戻して、Day 0 の夜。何カ所かで前夜祭が開催されていたようですが、私はさくらインターネットさん主催の「さくらの夕べ」に参加していました。予想していなかった方にお会いできたり、ゆるい雰囲気ながらもとても刺激になる良い話をたくさん聞かせていただいたりと、参加してよかったです。開催ありがとうございました。また、お話ししてくださった皆様ありがとうございました。
 ここ、廃校を利用した施設だったと思うのですが、以前は普通に「学校だなぁ」という感じだったのに、今回行ったら全然違ってキラキラしていたのでびっくりしました。いつの間にこんなに進化していたんだ。。。

まとめ

 斯くも楽しいYAPC::Fukuokaでした。 全体として細かい技術要素の話に落ちず幅広い話が聞けること、幅広い層の登壇者や参加者がいること、そして、 開催が再開されて間もないこともあってか、参加者の極端なグループ化が起こっておらず、比較的多くの参加者とフラットな関係で新たな交流を築けることなどが良かったです。 もちろんそういう雰囲気になるようスタッフの皆さんの配慮、努力があってのことと思います。企画運営スタッフの皆様、講演で楽しく素晴らしいお話を聞かせてくださった皆様、そして一緒に会場の雰囲気を盛り上げて楽しい場にしてくれた皆様、どうもありがとうございました。
 来年はデカいぞ !

おまけ

 何人かの方に熱く語った「Windowsでも音声入力、すごいぞこれ!」なソフト、こちらです。音声だけでのパーフェクトを目指すのではなく、補助として考えるとちょうど良く、個人的にはもうこれなしで生活できません。
sakaik.hateblo.jp

飲食観光情報

 帰りに別の用事で寄った岡山の話も合わせて、飲食や観光などについてnoteの方に書いています。合わせてご笑覧ください。
note.com