MySQL チートシート - HirokiYoshida837/ISUCON2022 GitHub Wiki

MySQL 環境確認

service確認

sudo systemctl status mysql

バージョン確認

mysql --version

mysqlログイン

mysql -h localhost -P 3306 -u isucon -pisucon isucondition

別サーバーからアクセスできるようにする

  1. 設定ファイルを探す (例 : /etc/mysql/mariadb.conf.d/50-server.cnf)
  2. bind-address0.0.0.0 に設定し、 sudo systemctl restart mysql.service で設定を反映
  3. mysqlのCUIに入って、外部接続用のユーザを作成し、権限付与
CREATE USER `isucon`@`%` IDENTIFIED BY 'isucon'; 
GRANT ALL PRIVILEGES ON `isucondition`.* TO `isucon`@`%`;

これでもアクセスできない場合は、外部からの3306アクセスが無効になっているかもしれない。以下で無効にする。(レギュレーション問題ないかはチェックしておく)

sudo ufw allow 3306
※firewallが無効になっていたら無視。

mysqlのログ確認

mysql restart時のログにエラーがでていることもあるので、設定変更したら一応確認

sudo journalctl -u mysql

mysqldのlog binを無効化する

disable-log-bin

confに書いても効かない場合は、systemdの起動オプションで入れる

mysql/mariaDBでgenerated Columnする

こんな感じで、 xxx AS (xxx) とすれば多分できる.

isuumo問題で、mariaDBのときにGeneratedColumnしようとしたら、 NOT NULL 成約をうまく追加できなかった。調査しておいたほうがいいかも。

    popularity_desc INTEGER AS (-popularity),
    `point`     POINT AS (ST_GeomFromText(CONCAT("POINT(", latitude, " ", longitude, ")"), 4326)) STORED
    popularity_desc INTEGER AS (-popularity) NOT NULL,
    `point`     POINT AS (POINT(latitude, longitude)) STORED NOT NULL

xxx GENERATED ALWAYS AS... としても生成できるみたい。

    p geometry GENERATED ALWAYS AS (ST_GeomFromText(CONCAT("POINT(",latitude," ",longitude,")"),4326))

空間INDEX

空間Indexを使うときは、SRIDを指定しないとIndexがうまく効かないらしい。 デフォルトで4326になる、とかいう話をみかけたが指定しておいたほうがいいかもしれない。

参考リンク