20200103のMySQLに関する記事は4件です。

PHP7.4の性能比較 一億回のループとDB500万件からの検索

PHP7.4の性能比較を行ってみました。

現在契約しているレンタルサーバーのグレードをアップしようかなと思い、
ついでと言っては何ですが、どの程度性能が上がるかを確認するために、
PHPそれぞれのバージョンで性能を比較してみました。

比較対象としたバージョンは以下の通りです。
■5.6.40
■7.0.33
■7.1.31
■7.2.21
■7.3.9
■7.4.1

処理としてはPHPでは1億回の単純な足し算をfor文でぶん回す事と
DBはMarriaDBですが、インデックスが貼られていないテーブルから500万行より
適当な文字列の検索を行ってみました。

実行結果としてはこのような感じになりました。

バージョン php処理時間 MySQL処理時間
5.6.40 10.96秒 3.21秒
7.0.33 04.90秒 3.06秒
7.1.31 04.56秒 3.06秒
7.2.21 03.17秒 2.72秒
7.3.9 02.50秒 3.15秒
7.4.1 02.10秒 3.11秒

この結果より導き出される事は以下三点です。

DBの処理はPHPのバージョンに依存しない

処理時間の差については誤差の範囲です。

5.X系はすぐにでも7.x系にかえましょう

雲泥の差です。

7.x系は大差なしです。

確かにバージョンが上がるたびに処理速度が上がっています。
しかし、この処理はこのような計算です。

$j=0;
for ( $i = 0; $i < 100000000; $i++ ) {
$j=$j+$i;
}

何かコードを描く際に1億回ものループ処理を行うことって通常は無いですよね?
あっても100回~1000回程度だと思います。
コンマ何秒の世界を生きているわけではないのであれば無理してバージョンアップをする必要はないですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsのDBで型をintegerからfloatへ変更しnumber_fieldで小数点を扱えるようにする

前回の記事の続きで初めてfloat型を扱ったのでメモ

やりたい事

  • DBに間違ってinteger型で作ったカラムをfloat型に変更
  • form_for内でnumber_fieldで小数点を扱えるようにする
  • DBに保存した値を合計するメソッドを作る

参考

【Rails】form_for の number_field で小数を入力できるようにする
https://qiita.com/tegnike/items/07f789eb22c7a7bf6a19

マイグレーションを使ったカラムの追加、削除、データ型の変更 [ 自分用メモ ]
https://qiita.com/dawn_628/items/13fa64dc6d600e921ce3

【Rails】カラムの合計値を求める!
https://qiita.com/tomokichi_ruby/items/8758a91566957cfc5429

number_fieldでは整数のみしか扱えない

new.html.erb
<%= form_for @count_time do |f| %>
 <%= f.number_field :count_hour, class:'input_form' %>
 <%= f.submit '登録', class:'input_submit' %>
<% end %>

スクリーンショット 2020-01-03 17.33.24.png

というフォームがあって,

小数点の数字をいれると,
スクリーンショット 2020-01-03 17.35.00.png
というふうになるので

new.html.erb
<%= form_for @count_time do |f| %>
 <%= f.number_field :count_hour, step: '0.1', class:'input_form' %>
<%# step: '0.1'を追加 %>
 <%= f.submit '登録', class:'input_submit' %>
<% end %>

step: '0.1'を追加すると小数点以下第一位までの数値を扱えるようになります

このままだとDBには整数でしか保存されない

DBの count_hourinteger型なので整数のみしか保存してくれないのでカラムの型を変更する

ターミナル
$ rails g migration change_data_count_hour_to_count_time
Running via Spring preloader in process 94544
      invoke  active_record
      create    db/migrate/20200103074431_change_data_count_hour_to_count_time.rb

カラム名がcount_hourでテーブル名がcount_timeになります

20200103074431_change_data_count_hour_to_count_time.rb
class ChangeDataCountHourToCountTime < ActiveRecord::Migration[5.2]
  def change
    change_column :count_times, :count_hour, :float #追記。テーブル名は複数形で
  end
end

rails db:migrateします

これでfloat型に変更できたのでnumber_fieldから送られる小数点の値がDBへ保存できるようになりました

DBの値をビューへ描画

index.html.erb
  <table>
    <tr>
      <th>日付</th>
      <th>時間</th>
    </tr>
    <% @count_time.each do |count_time| %>
      <tr>
        <td><%= count_time.created_at.to_date %></td>
        <td><%= count_time.count_hour %>時間</td>
      </tr>
    <% end %>
  </table>

スクリーンショット 2020-01-03 17.50.13.png

sumメソッドを使い学習時間の合計を表示させる

count_time_controller.rb
class CountTimesController < ApplicationController
 def index
  @count_time = CountTime.where(user_id: current_user.id).order('updated_at DESC').limit(5)
  @count_hour = @count_time.sum(:count_hour)
 end
end

sumメソッドの引数にカラムを指定するで合計値を出します

完成

スクリーンショット 2020-01-03 18.04.07.png

まとめ

ひとまずこれで自分が最初に想像していた主要機能が完成しました。開発にそんな時間がかからないアプリでしたが知らない事も学べたので良かったかなと。あとは思い付いた追加の機能を開発していこうと思います。

終わり

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VagrantにMySQLをインストールし、ローカルから接続する

この記事について

テスト用のDBが欲しかったのですが、ローカル環境にDBを作成したくなかったので、Vagrantを立てて、そこにMySQLを落としてみました。そのやり方を記述します。また、ローカル側のMySQLWorkbenchからVagrant上のMySQLに接続する際にエラーが出たのですが、グーグルで調べても解決策の情報があまり載っていなかったため、苦労しました。そこも触れていきます。

環境

ローカル
Mac
Vagrant 2.2.6
Virtualbox 5.2

仮想環境 (192.168.33.10)
CentOS 7.2

手順

以下の流れで行なっていきます。
1. Vagrantを起動する(vagrant init)
2. Vagrantfileとprovision.shを編集する
3. Vagrant upする
4. MySQLに接続してみる
5. MySQLへの接続許可するように設定する

TRY!

1. Vagrantを起動する(vagrant init)

まず、Mac上で仮想サーバーを立てるフォルダを作成し、vagrant initのコマンドを実行します。
image.png

これで、Vagrantのテンプレファイルが作成されました。
image.png

2. Vagrantfileとprovision.shを編集する

次に、Vagrantfileを編集します。ちなみにVagrantileとは、仮想サーバーを立てる際に、どうやってサーバーを立てるかの指示が書かれているもので、例えば、どんなOSを仮想サーバーに入れるのか、フォルダの書込許可はどのユーザーに当てるのか、などが設定できます。

今回は、Vagrantfileで3つの指示を指定します。
1. CentOSをOSに指定
2. MySQLをインストール
3. ローカル(ホスト)からアクセスできるIPアドレスを解放

2については、サーバーを立てた後でCentOSのコマンドを叩いても可能ですが、サーバーを立てる際にインストールした方が手間が省けます。

1. CentOSをOSに指定

Vagrantfileをテキストエディタで開き、以下の箇所を変更します。

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "base"

After:

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "bento/centos-7.2"

見ての通り、config.vm.boxではOSを指定することができるのがわかるかと思います。

2. MySQLをインストール

次に、MySQLをインストールするため、先ほどのコードの下に、以下を追記します。

  #Run provision.sh
  config.vm.provision :shell, :path => "provision.sh"

config.vm.provision :shell.shファイルを実行するという指示を意味します。:path =>の後に.shファイルのパスを書きます。今回はprovision.shというファイルを指定します。

次に、provision.shを作成しましょう。ターミナルでvi provision.shを実行します。
image.png

作成されたprovision.shで以下のようにMySQLをインストールし、デーモンを起動するようにします。

# Install MySQL
sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
sudo yum -y install mysql-community-server

# Start MySQL when vagrant is up
sudo systemctl enable mysqld.service
sudo systemctl start mysqld.service

3. ローカル(ホスト)からアクセスできるIPアドレスを解放

最後に、ローカル(ホスト)から仮想サーバー(ゲスト)アクセスできるIPアドレスを解放するため、Vagrantfileのconfig.vm.network "private_network"の箇所をコメントアウトします。

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"

これにより、Vagrantを起動するだけで、192.168.33.10にMySQLの入ったCentOSが作成されます。

3. Vagrant upする

次に、Vagrantを起動するため、vagrant upを実行します。
image.png
こんな感じで、仮想サーバーが作られていきます。

4. MySQLに接続してみる

このままMySQLに接続するとどうなるのかを検証します。
まず、仮想サーバー(ゲスト)にSSHでアクセスし、MySQLに接続できるか確認します。仮想サーバー(ゲスト)にSSHでアクセスするため、以下のコマンドを叩きます。

$vagrant ssh

image.png
これで、Vagrant内に入れました。

次に、MySQLに接続します。provision.shで作成されたMySQLでは、デフォルトではパスワードのないrootユーザーが作成されているので、以下のコマンドで接続できます。

$mysql -u root -p

すると、パスワードを聞かれますが、Enterを押します。
image.png

これで、MySQLへの接続が確認できました。

今度は、ローカル(ホスト)からMySQLに接続ができるか確認するため、MySQLWorkbenchを開き、以下の情報を入力します。

Hostname: 192.168.33.10
Port: 3306
Username: root
Password: (blank)

image.png

すると、以下のようなメッセージが出てきます。
image.png
Can't connect to MySQL server on '192.168.33.10' (60)

同じことがMacのターミナルからtelnetで確認できます。

$telnet 192.168.33.10 3306

実際のスクショ:
image.png

どうやら、192.168.33.10自体に繋がってなさそうです。
pingで接続確認します。
image.png
pingすら通っていませんね。。

Vagrantfileのあるフォルダ配下で、vagrant reloadを実行し、再度pingしてみます。
image.png
image.png

pingが通りました。自分の場合、config.vm.network "private_network"のコメントアウトをしたのが実はvagrant upの後だったのでこのエラーが出ていたようです。記事を書きながら動かしていたのでうっかりしていました。

再度、ローカルからMySQLに接続できるか確認します。今回はTelnetのみ実行します。MySQLWorkbenchでも同じ結果が出ます。
image.png

これは、仮想サーバ(ゲスト)側のMySQLが、ローカル(ホスト)からのアクセスを拒んでいる時に出てくるメッセージです。次のステップでこれを解消します。

5. MySQLへの接続許可するように設定する

再度、仮想サーバー(ゲスト)にSSHでアクセスし、MySQLにrootユーザーでアクセスします。次に、以下のクエリを実行すると仮想サーバー(ゲスト)のMySQLはどこからでもrootユーザーのアクセスを許可するようになります。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

実際のスクショ:
image.png

実行後Ctrl+Cmysql>を閉じ、systemctl restart mysqldでデーモンを再起動します。この時、VagrantのRootユーザのパスワードが聞かれます。パスワードはディフォルトでvagrantです。

ローカル(ホスト)側に戻り、MySQLWorkbenchで接続確認します。

image.png

無事接続できました。

最後に

以上、VagrantにMySQLをインストールし、ローカルから接続する方法でした。自分はあまり環境構築に慣れていないため、苦労しました。。どうか参考になったと感じたら「いいね」してもらえると幸いです。

参考

Connect to a MySQL Server inside of a Vagrant Machine from the Host Machine
vagrant上のmariadbにローカルのマネージメントツールからアクセスするためにやったこと

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLでカラム名が変えられない

ドットインストールでPHP学習入門を取り組んでいる際...

index.phpにて
  // ユーザーをDBに登録してブラウザに user add!!! と出力したい
  $db->exec("insert into users (name, score) values ('tanaka', 99)");
  echo "user add!!!";

よっしゃ、これでOKなはずと思ったがブラウザで以下エラーが表示される:fearful:

エラーSQLSTATE[42S22]: Column not found: 1054 Unknown column 'score' in 'field list'

原因

ターミナルでusersテーブルを見ると、scoreで作ったはずがscireと作っていました。

mysql> desc users;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| scire | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

ささっとググり、ターミナルでカラム名を変更るためにコマンドを叩く

alter table users change column scire score;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

あれなんでエラーが出るんだろう.....

対策

カラム名を変更するときは型も指定しなければいけない
先ほどのコマンドの最後にintを追加して再度実行すると、無事DBにデータも登録出来てブラウザにも期待通りの出力が出来ました:v_tone2:

mysql> alter table users change column scire score int;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc users;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| score | int(11)      | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む