20200326のMySQLに関する記事は9件です。

PHPでデータベースに使ってみるための備忘録

はじめに

LAMP環境を整えてPHP使っておきながらPHP内でのデータベースの使い方がわからなかったので、忘れないようにまとめておきます。

簡単なスタッフの追加ページぽい何かとスタッフ一覧ページぽいものを作りながら簡単にまとめておきます。

準備

phpMyAdminを使ってデータベースに簡単なスタッフ管理を想定したテーブルを作ります。
カラムは3つで「code,name.password」のカラムを作ります。このうちcodeを主キーにします。
データの方などは以下の画像を参照してください
Screenshot from 2020-03-26 10-00-20.png

作ってみる

スタッフ追加ページ

まずはスタッフ追加ページを作ります。
スタッフ名とパスワード・確認用パスワードを入力する欄をHTMLで用意します。

staff_add.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    スタッフ追加<br/>
    <br/>
    <form method="post" action="add_confirm.php">
        スタッフ名を入力してください<br/>
        <input type="text" name="name" style="width:200px"><br/>
        パスワードを入力してください<br/>
        <input type="password" name="pass" style="width:100px"><br/>
        パスワードをもう一度入力してください<br/>
        <input type="password" name="pass2" style="width:100px"><br/>
        <br/>
        <input type="submit" value="登録">
    </form>
</body>.
</html>

Screenshot from 2020-03-26 22-50-34.png

ここまでは大丈夫…
問題のデータベースは次から…

データベースに接続

何度もデータベース接続のコードを書くのが面倒なので、使いまわし用の関数を入れたphpファイルを作ります。

connect.php
<?php
// データベースに接続
function connectDB() {
    $dsn = 'mysql:dbname=データベース名;host=localhost;charset=utf8'; //データベース名とホスト名
    $user='root';   //データベースのユーザー名
    $password='****';    //データベースのパスワード
    try {
        $dbh = new PDO($dsn, $user,$password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        return $dbh;

    } catch (PDOException $e) {         //  データベースに接続出来なかった場合の処理
        print'エラー';      //  エラーメッセージを表示して終了
        exit();
    }
}
?>

PDOオブジェクトを使ってデータベースに接続しています。
使い方はこちら(PDOを使ったPHPでのデータベース基本操作)を参考にさせていただきました。

入力データの確認

スタッフ追加ページのstaff_add.htmlで入力されたスタッフ名とパスワードの確認ページを作ります。
スタッフ名の未入力やパスワードと確認用パスワードが一致していない場合の処理も作っていきます。

add_confirm.php
<?php


    //staff_add.htmlからデータ受取
    $staff_name=$_POST['name'];
    $staff_password=$_POST['pass'];
    $staff_password2=$_POST['pass2'];

    //エスケープ処理
    $staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
    $staff_password=htmlspecialchars($staff_password,ENT_QUOTES,'UTF-8');
    $staff_password2=htmlspecialchars($staff_password2,ENT_QUOTES,'UTF-8');

    //以下、入力内容確認処理

    if($staff_name==''){
        print'スタッフ名が入力されていません。<br/>';
    }else{
        print'スタッフ名:';
        print $staff_name;
        print'<br/>';
    }

    if($staff_password!=$staff_password2){
        print'パスワードが一致しません。<br/>';

    }

    if($staff_name==''||$staff_password==''||$staff_password!=$staff_password2){
        //入力内容に問題があれば戻るボタンのみ表示
        ?>
        <form>
          <input type="button" onclick="history.back()" value="戻る">
        </form>
        <?php
    }else{
        //MD5方式でパスワードをハッシュ化
        $staff_password=md5($staff_password);
        ?>
        <form method="post" action="add_done.php">
          <input type="hidden" name="name" value="<?php print $staff_name;?>">
          <input type="hidden" name="pass" value="<?php print $staff_password;?>"><br/>
          <input type="button" onclick="history.back()" value="戻る">
          <input type="submit" value="登録">
        <form>
        <?php

    }
?>

エスケープ処理については以下を参考にしました。
PHPでエスケープが必要な時と方法を最短理解!
「何故htmlspecialcharsを通すのか?」を一言でどうぞ

データベースにレコードを追加

次は、前の画面で確認したスタッフ名とハッシュ化したパスワードを受け取って、データベースに追加する処理を作ります。

add_done.php
<?php

require_once 'connect.php';
$dbh = connectDB();

try {

    $staff_name=$_POST['name'];
    $staff_password=$_POST['pass'];
    //エスケープ処理
    $staff_name=htmlspecialchars($staff_name,ENT_QUOTES,'UTF-8');
    $staff_password=htmlspecialchars($staff_password,ENT_QUOTES,'UTF-8');

    $sql='INSERT INTO テーブル名(name,password) VALUES (?,?)';   //SQL命令文 入れたいデータは「?」
    $stmt=$dbh->prepare($sql);    //準備する命令
    $data[]=$staff_name;          //「?」にセットしたいデータを順番に書き出し
    $data[]=$staff_password;
    $stmt->execute($data);        //クエリの実行

    $dbh=null;      //データベース切断

    print $staff_name;
    print 'さんを追加しました。<br/>';

}catch(Exception $e){
    print'エラー';
    exit();
}

?>
<a href="staff_list.php">戻る</a>

これでどこかミスってなければデータベースにユーザー名とパスワードのレコードが追加されてるはず。
(passwordには「test」をハッシュ化したものが入ってます)
Screenshot from 2020-03-26 23-22-07.png

スタッフ一覧

せっかくなのでデータベースに追加したスタッフの一覧を表示させるページも作ります。

staff_list.php
<?php
require_once 'connect.php';
$dbh = connectDB();

try{
    $sql='SELECT name FROM テーブル名 WHERE 1'; 
    $stmt=$dbh->prepare($sql);
    $stmt->execute();

    $dbh=null;

    print'スタッフ一覧<br/>';
    while(true){
        $rec=$stmt->fetch(PDO::FETCH_ASSOC);
        if($rec==false){
            break;
        }
        print $rec['name'];
        print '<br/>';
    }

}catch(Exception $e){
    print 'エラー';
    exit();
}

?>
<br/>
<input type="button" onclick="location.href='./staff_add.html'" value="スタッフ追加">

最後に、最初に作ったスタッフ追加ページに飛ぶ飛ぶスタッフ追加ボタンもつけておきます。

Screenshot from 2020-03-26 23-28-00.png
出来た出来た。追加と表示しかしてないけどとりあえず出来た。

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

MySQLへの接続、SQL文の実行

今日は、MySQLへの接続SQL文の実行コマンドを紹介していきます!
ターミナルでコマンドを実行してみましょう^^

mysqlへ接続する

mysql -u root

ターミナルに以下のように表示されていれば、正常に接続できています

mysql>

データベース一覧を表示する

SHOW DATABASES;

*SQL文は必ず、終わりにセミコロンをつける必要があります!
もし;(セミコロン)を忘れて入力してしまった場合は、以下のようになります

mysql> SHOW DATABASES
         -> 

セミコロンを忘れて実行すると、SQLがまだ続くとみなされてしまいます
こうなった場合は、セミコロンのみを入力してエンターキーを押すと、正常に実行されます^^

実行後は、これまで作ってきたデータベースが一覧になって表示されます!

mysql> SHOW DATABASEs;
+-------------------------------------+
| Database                            |
+-------------------------------------+
| information_schema                  |
| DataBaseDesignSample_development    |
| DataBaseDesignSample_test           |
| chat-space_development              |
| chat-space_test                     |
| comment-box_development             |
| comment-box_test                    |
| drill_app_development               |
| drill_app_test                      |
| effective_model_sample_development  |
| effective_model_sample_test         |
| exception_sample_development        |
| exception_sample_test               |
| exp-exam-pictweet_development       |
| exp-exam-pictweet_test              |
| exp-html-exam_development           |
| exp-html-exam_test                  |
| freemarket_sample_68a_development   |
| freemarket_sample_68a_test          |
| git-app_development                 |
| git-app_test                        |
| mini_sns_development                |
| mini_sns_test                       |
| mysql                               |
| our_blog_development                |
| our_blog_test                       |
| ourblog_exam1_development           |
| ourblog_exam1_test                  |
| ourblog_exam3_development           |
| ourblog_exam3_test                  |
| performance_schema                  |
| pictweet4_development               |
| pictweet4_test                      |
| pictweet_development                |
| pictweet_exam1_development          |
| pictweet_exam1_test                 |
| pictweet_exam2_development          |
| pictweet_exem_retest_development    |
| pictweet_exem_retest_test           |
| pictweet_test                       |
| pictweet_workshop_exam_development  |
| pictweet_workshop_exam_test         |
| practice-exam-pictweet2_development |
| practice-exam-pictweet2_test        |
| reverse-app_development             |
| reverse-app_test                    |
| search_pictweet_development         |
| search_pictweet_test                |
| sql_curriculum_development          |
| sql_curriculum_test                 |
| sqltest                             |
| test                                |
| todo_app_development                |
| todo_app_test                       |
| view_drill_development              |
| view_drill_test                     |
+-------------------------------------+
56 rows in set (0.03 sec)

これでどんなデータベースがあるのか確認することができましたね!
次回は、データベースを作成するためのコマンドを紹介したいと思います^^

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

MySQLへの接続、SQL文の実行

今日は、MySQLへの接続SQL文の実行コマンドを紹介していきます!
ターミナルでコマンドを実行してみましょう^^

  1. mysqlへ接続する
mysql -u root

ターミナルに以下のように表示されていれば、正常に接続できています

mysql>
  1. データベース一覧を表示する
SHOW DATABASES;

*SQL文は必ず、終わりにセミコロンをつける必要があります!
もし;(セミコロン)を忘れて入力してしまった場合は、以下のようになります

mysql> SHOW DATABASES
         -> 

セミコロンを忘れて実行すると、SQLがまだ続くとみなされてしまいます
こうなった場合は、セミコロンのみを入力してエンターキーを押すと、正常に実行されます^^

実行後は、これまで作ってきたデータベースが一覧になって表示されます!

mysql> SHOW DATABASEs;
+-------------------------------------+
| Database                            |
+-------------------------------------+
| information_schema                  |
| DataBaseDesignSample_development    |
| DataBaseDesignSample_test           |
| chat-space_development              |
| chat-space_test                     |
| comment-box_development             |
| comment-box_test                    |
| drill_app_development               |
| drill_app_test                      |
| effective_model_sample_development  |
| effective_model_sample_test         |
| exception_sample_development        |
| exception_sample_test               |
| exp-exam-pictweet_development       |
| exp-exam-pictweet_test              |
| exp-html-exam_development           |
| exp-html-exam_test                  |
| freemarket_sample_68a_development   |
| freemarket_sample_68a_test          |
| git-app_development                 |
| git-app_test                        |
| mini_sns_development                |
| mini_sns_test                       |
| mysql                               |
| our_blog_development                |
| our_blog_test                       |
| ourblog_exam1_development           |
| ourblog_exam1_test                  |
| ourblog_exam3_development           |
| ourblog_exam3_test                  |
| performance_schema                  |
| pictweet4_development               |
| pictweet4_test                      |
| pictweet_development                |
| pictweet_exam1_development          |
| pictweet_exam1_test                 |
| pictweet_exam2_development          |
| pictweet_exem_retest_development    |
| pictweet_exem_retest_test           |
| pictweet_test                       |
| pictweet_workshop_exam_development  |
| pictweet_workshop_exam_test         |
| practice-exam-pictweet2_development |
| practice-exam-pictweet2_test        |
| reverse-app_development             |
| reverse-app_test                    |
| search_pictweet_development         |
| search_pictweet_test                |
| sql_curriculum_development          |
| sql_curriculum_test                 |
| sqltest                             |
| test                                |
| todo_app_development                |
| todo_app_test                       |
| view_drill_development              |
| view_drill_test                     |
+-------------------------------------+
56 rows in set (0.03 sec)

これでどんなデータベースがあるのか確認することができましたね!
次回は、データベースを作成するためのコマンドを紹介したいと思います^^

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

Ruby単体でDB接続したいとき(MySQL)

はじめに

RubyでDBに接続したい時があるかと思います。

例えばスクレイピングしてきた情報をDBに格納したい時など。

ActiveRecordを使うと実装できます。

ActiveRecordはRailsに搭載されているので、皆さんご存知かとは思いますが、

ACtiveRecordを単体で使ったことがない方は結構いらっしゃるかと思いますので、ご紹介します。

今回はMySQLを使います。

ActiveRecordを単体で使ってみる

準備

まずはDBを用意しましょう。MySQLにログインします。

mysql -u root

データベースを作ります。名前は今回sampleにします。

mysql> create database sample;

sampleデータベースに入ります。

mysql> use sample;

テーブルを作ります。名前は今回usersにします。Rubyの規約上、テーブル名は複数形にしてください(sをつける)

mysql> create table product (id int auto_increment not null primary key, name varchar(10));

一旦抜けましょう

mysql> exit

続いてActiveRecordをインストールしましょう

$ gem install activerecord

mysql2もインストールします

$ gem install mysql2

実装

これで準備ができたのでRubyのファイルを作ります

$ vi sample.rb

avtive_recordのgemを呼び出し、DBの接続設定を以下のように記します

sample.rb
# ↓ ファイルに書く時はアンダースコアがいるので注意
require 'active_record' 

#DB接続設定
 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

更にUserクラスを設定します。これでDBのusersテーブルがいじれるようになります

sample.rb
require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

#以下追記
class User < ActiveRecord::Base
end

試しにUserテーブルにレコードを作りましょう

sample.rb
require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

class User < ActiveRecord::Base
end

#以下追記
User.create(name: "taro")

実行してみます

$ ruby sample.rb

ファイルを変更してレコードができたか確認しましょう

sample.rb
require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

class User < ActiveRecord::Base
end

#以下変更
puts User.find_by(name: 'taro').name

実行

$ ruby sample.rb

以下のように出ればOKです。

taro

終わりに

今回は一つのファイルの中に設定など全て書きましたが、実際に使う時は、DB接続設定を他のRubyファイルに書いてrequireするか、もしくは、YMLファイルに設定を書いて読み込んだりなどして使ってみてください。

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

Ruby単体でDB接続したい時(MySQL)

はじめに

RubyでDBに接続したい時があるかと思います。

例えばスクレイピングしてきた情報をDBに格納したい時など。

ActiveRecordを使うと実装できます。

ActiveRecordはRailsに搭載されているので、皆さんご存知かとは思いますが、

ACtiveRecordを単体で使ったことがない方は結構いらっしゃるかと思いますので、ご紹介します。

今回はMySQLを使います。

ActiveRecordを単体で使ってみる

まずはDBを用意しましょう

mysql -u root

データベースを作ります。名前は今回sampleにします。

mysql> create database sample;

sampleデータベースに入ります。

mysql> use sample;

テーブルを作ります。名前は今回usersにします。Rubyの規約上、テーブル名は複数形にしてください(sをつける)

mysql> create table product (id int auto_increment not null primary key, name varchar(10));

一旦抜けましょう

mysql> exit

続いてActiveRecordをインストールしましょう

gem install activerecord

mysql2もインストールします

gem install mysql2

続いてrubyのファイルを作ります

$ vi sample.rb

avtive_recordのgemを呼び出し、DBの接続設定を以下のように記します

sample.rb
# ↓ ファイルに書く時はアンダースコアがいるので注意
require 'active_record' 

#DB接続設定
 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

更にUserクラスを設定します。これでDBのusersテーブルがいじれるようになります

sample.rb
require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

#以下追記
class User < ActiveRecord::Base
end

試しにUserテーブルにレコードを作りましょう

sample.rb
require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

class User < ActiveRecord::Base
end

#以下追記
User.create(name: "taro")

実行してみます

ruby sample.rb

ファイルを変更してレコードができたか確認しましょう

sample.rb
require 'active_record' 

 ActiveRecord::Base.establish_connection( 
  adapter:  "mysql2", 
  host:     "localhost", #ローカルのDBに接続します。
  username: "root", #ユーザー名
  password: "",  #設定したMySQLのパスワード
  database: "sample",  #接続したいDB名
)

class User < ActiveRecord::Base
end

#以下変更
puts User.find_by(name: 'taro').name

実行

ruby sample.rb

以下のように出ればOKです。

taro

終わりに

今回は同じファイルの中に設定など全て書きましたが、実際に使う時は、DB接続設定を他のRubyファイルに書いてrequireするか、もしくは、YMLファイルに設定を書いて読み込んだりなどして使ってみてください。

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

【mysql】rootユーザで理者権限でないとログインできない場合の対応したこと

1.sudo mysql -u root -pでログインする。
2.ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
※'PASSWORD'にはパスワードを入力します。
3.FLUSH PRIVILEGES; フラッシュ権限操作を実行しリロードする。
4.exit;で抜けた後に再度mysql -u root -pでログインし設定したパスワードでログインできることを確認する。

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

【mysql】rootユーザで管理者権限でないとログインできない場合の対応したこと

1.sudo mysql -u root -pでログインする。
2.ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
※'PASSWORD'にはパスワードを入力します。
3.FLUSH PRIVILEGES; フラッシュ権限操作を実行しリロードする。
4.exit;で抜けた後に再度mysql -u root -pでログインし設定したパスワードでログインできることを確認する。

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

<まとめ>DB非機能設計 : MySQLの可用性、拡張性をどう保障するか。

RDSのマルチAZ化
RDSのマルチAZ配置で可用性、フェイルオーバを図ることができる。
Oracle、PostgreSQL、MySQL、MariaDBのマルチAZ配置
… Amazonフェールオーバ機能が適用
SQL Server DBのマルチAZ配置 
  …SQLサーバのミラーリングが適用

プライマリDBインスタンスのレプリカ(スタンバイレプリカ)が別のAZに複製される。
基本的にRDSマルチAZ配置しておけばフェールオーバがなされるため、障害耐久性が向上する

マルチAZ化のやり方:
新規DBマルチAZ化→ RDSコンソールDBインスタンス作成時に指定
既存DBマルチAZ化 → DBインスタンス変更しAZオプション指定
AWS CLI、 Amazon RDS APIからも可能 *参照: link

ポイント: レイテンシについて
マルチAZ使用DBインスタンスは、シングルAZ配置よりレイテンシが上がることがあるので、レイテンシの変動を抑えるために、プロビジョンドIOPSおよびDBインスタンスクラスを使用することが推奨される。
プロビジョンドIOPS… EBSボリューム値タイプの一つ
EBSのボリュームをプロビジョンドIOPSにすることで、マルチAZ化したときに発生するレイテンシを最低限に抑えることができる。
そのほかEBS汎用SSDがあるがプロビジョンドよりパフォーマンスに劣る。

プロビジョンド … 最大IOPS 64000 
最大スループット 1000MB/sec
汎用 … 最大IOPS16000
最大スループット 250MB/sec

MySQLの高可用性構成

非同期レプリケーション … アップデート時に1つのDB更新し、時間がたってから別のDBに更新。
準同期レプリケーション…アップデート時にスレーブに変更情報が伝搬した(適用でない)時点でコミット
同期レプリケーション … アップデート時に全てのDBを更新する。

MySQLレプリケーションパターン
・マスタ>スレーブ
・マスタ>マルチスレーブ
・マルチマスタ>スレーブ (非推奨)
・マスタ>スレーブ>マルチスレーブ
・マスタ<>マスタ
・循環型マルチマスタ

MHAについて
MHA
MySQLのマスタ障害時に最新スレーブをマスタとして昇格させ、自動的にフェールオーバを行うオープンソースツール
マスタ自動フェイルオーバの実現
マスタ無停止メンテの実現
MySQL5.0以降で動作
MySQLの特徴とMHAでできること
- MySQLはマスタ1つのみ
- スレーブの冗長化自体は簡単にできる
- MySQLのレプリケーションは非同期または準同期
- 同期ではないのでマスタ障碍児にスレーブが最新のログを受け取っていない場合がある
- なのでスレーブ間でのずれを解消する必要がある
- これを自動で解決するのがMHA
- 差分の計算、保存をスレーブ間で並列で行う
- 秒単位でのフェールオーバを実現
RDSでなくEC2環境でMySQLを動作させる際は、MHAでフェールオーバできる。(RDSでは自動)

Amazon DB クラスター構成
AuroraArch001.png

構造:
- クラスタは1つ以上のDBインスタンスと、1つのクラスタボリュームで構成される。
- クラスタボリューム … マルチAZ化された仮想データベースストレージボリューム
- クラスタはプライマリとレプリカDBインスタンスで構成される。
- プライマリは、全てのクラスタボリュームへの変更を実行する。
- レプリカは、読み取りのみ。ストレージボリュームに接続し、情報を取得。
- 一つのプライマリDBに対して15個のレプリカを持つことが可能。
- レプリカをマルチAZ化することで可用性を高められる。
- プライマリ障害時は自動的にレプリカにフェールオーバしてくれる。
- マルチマスタ構成にするとプライマリとレプリカの間で違いがなくなる。(全DBが読み書き可能になる)

データベースの拡張性保証
高可用性と拡張性
可用性 : 障害時の対処、リカバリ能力
拡張性 : データベース、クエリの負荷を複数のMySQLサーバに分散
ha-cost-vs-nines.png

シェアードナッシング : 分散コンピューティングでのリソースの共有の排除
シャードデータベースアーキテクチャ
シャーディング : データを小さなサブセットに分割、それらを多数のデータベースサーバに分配する。

sharding-amazon-rds-1.gif

データパーティション設計とスキーマ設計
例 : customer_idをパーティションキーとする
sharding-amazon-rds-2.gif

Spiderエンジン
DBの分散処理を可能にするオープンソースツール
EC2でMySQL(Spider編1)
MySQL Spiderエンジンを使ってみた
・ 異なるMySQLインスタンスのテーブルを同一インスタンスのテーブル用に扱うことが可能
・ 更新系DBのクラスタリングに利用可能
・ パーティショニングルールで同一テーブルテーブルを複数サーバに分散配置が可能
・ 仕組み的にはストレージエンジンのテーブル内でシンボリックリンク的な動きをする
・ ローカルMySQLサーバからリモートMySQLサーバへのコネクションで実現
・ リンク先テーブルのストレージエンジンに制限はない
・ MySQL、MariaDBはサポートされているが、Auroraはされていない

1100万以上のユーザデータのスケーリング事例
Amazon AWSでユーザ数1100万以上にスケーリングするためのビギナーズガイド
スケーリングに必要な要素
・ フェデレーション : データベースを機能に基づき複数のDBに分割
・ シャーディング : 上記説明
・ 従来型リレーショナルSQLデータベースを使用
・ SPOFをなくす(すべての段階を冗長化)
・ インフラの内部、外部のデータをキャッシング
・ インフラ内での自動化ツールの利用
・ メトリクス、モニタリング、ロギングを配備しアプリケーションのパフォーマンスを監視
・ ティアをSOA化
・ Auto Scalingの使用

~まとめ~
・データベースの拡張性、可用性を上げるには、前提として、データベースはAuroraを使用。AWS上でマルチAZ化され、システムは必要であればサービス指向で構成されているものとする。
・可用性、拡張性を保証する手段の一つとしてシャードデータベースアーキテクチャがある
・同じテーブルを複数のデータベース(シャード)に分散して処理の効率化を図る
・異なるシャード間でのデータ共有を排除することにより、データアクセスへのレイテンシを減らす
・障害発生時もシャード毎でフェールオーバするので、拡張性も保証される。
・オープンソースのSpiderというソースを使用することで、コーディングの手間を省き、分散処理を実現することが可能。

おわり

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

SQLに関する基本をまとめさせていただきました

基本

ローカル環境ではバックでMySQLが動いている状態

サーバーに接続

dbを作る

table(行列)としてデータを作る

アプリ1つにつき1つデータベースがあり、
データベースの上にはテーブルが複数設置できる

データベース毎に取り扱えるユーザーを限定するのが基本

命令を書いたファイルをターミナルで指定して実行するのが主流
その命令にはdbを作るやtableを作るやデータ入力をする命令を書ける
またそこにはデータ入力時の条件も書ける
ex.一意性、 デフォルト値、 空を許さないなど

viewとはtableにいくつも持てる物で、特定の条件を満たしたtableという感じ
tableが条件付きtableを何個も持てるので、見返す時に便利

トランザクション
→まとめて行いたい処理をまとめて行えるようにする
ex. 2つのデータ更新をまとめて行いたい時

特定のカラムに索引、インデックスをつけるとデータ抽出が速くなる
しかしいろんなカラムにつけると、その処理に時間がかかり元も子もないのでおすすめはしない

複数のテーブルの紐付け
Aテーブルの外部キーとBテーブルの主キーが一致していることが必要になる。
Join onで表示可能

トリガーとは
あるtableで入力や削除や変更がされたら、トリガーでという別の場所でその記録をを保存できる

クエリとサブクエリとは
クエリとはデータを読み出す命令のこと。
サブクエリとは、読み出した値を条件に入れてデータを読み出すために使う命令

わざわざデータから新しく抽出した値をカラムとして保存しない場合に、一時的に新しい値を得る時に使う。

SQLの処理の順番

FROM:データを取ってくる

JOIN:データを統合する

WHERE:データの所得条件を絞る

GROUP:グループに分けて、その中で関数処理をして出力をする。そのためGROUPと関数はセット

関数:データにある値をいじって出力、GROUP無しでも使える

HAVING:グループ化した後にデータ所得の条件を絞る

SELECT:読み出したいデータを決める

ORDER:好きな順番に並べる

LIMIT:見れる範囲を狭める

読み出す時の注意
どういう条件で絞るのか、どういうグループ分をするのかを大切にする

またそれらの処理がどういう順番なのかも注意する

開発中に行列の形で見たい時(SQliteの時)

DB browser for sqliteをダウンロード

アプリのDBの中にあるdevelopment sqliteをダウンロードしてDB browser for sqliteで見る

add-indexでカラムにインデックスを付けること

rails g migrationで任意のカラムにインデックスを加えるマイグレーションファイルを作る(emailカラムに使われる事が多い)

rails db migrateでデータに反映
emailカラムにインデックスが付く→これによって検索が速くなる(インデックスのおかげでアルファベット順に並べ替えたりできるから)

またadd-indexマイグレーションファイルのオプションとしてunique:trueにする事で、カラムの内容は一意性でないといけなくなる(つまり同一のメルアドは登録できない)

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